劍指Offer之二叉搜索樹與雙向鏈表

題目描述

  輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能建立任何新的結點,只能調整樹中結點指針的指向。node

基本思路

  假設二叉搜索樹爲{10,6,14,4,8,12,16},按照中序遍歷,當咱們遍歷轉換到根節點(值爲10的節點)時,它的左子樹已經轉換成一個排序的鏈表了,而且處在鏈表的最後一個節點是當前最大的節點。咱們把值爲8的節點和根節點連接起來,此時鏈表中的最後一個節點就是10了。接着咱們去遍歷轉換右子樹,並把根節點和右子樹的最小的節點連接起來。轉換左子樹和右子樹,使用遞歸的方法。this

Java代碼

package com.swordOffer.convertBinarySearchTree18; /** * Created by Feng on 2017/5/15. * 輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。 * 要求不能建立任何新的結點,只能調整樹中結點指針的指向。 */
public class ConvertBinarySearchTree { public static void main(String[] args) { TreeNode node1 = new TreeNode(10); TreeNode node2 = new TreeNode(6); TreeNode node3 = new TreeNode(14); TreeNode node4 = new TreeNode(4); TreeNode node5 = new TreeNode(8); node1.left = node2; node1.right = node3; node2.left = node4; node2.right = node5; TreeNode result = convertNode(node1); System.out.println(result.val); } public static TreeNode convertNode(TreeNode pRootOfTree) { //若是根節點爲空,返回空
        if (pRootOfTree == null) { return null; } //若是隻有根節點
        if (pRootOfTree.left == null && pRootOfTree.right == null) { return pRootOfTree; } //轉換左子樹
        TreeNode pLeft = convertNode(pRootOfTree.left); TreeNode pNode = pLeft; while (pNode != null && pNode.right != null) { pNode = pNode.right; } if (pLeft != null) { pNode.right = pRootOfTree; pRootOfTree.left = pNode; } //轉換右子樹
        TreeNode pRight = convertNode(pRootOfTree.right); if (pRight != null) { pRootOfTree.right = pRight; pRight.left = pRootOfTree; } return pLeft != null ? pLeft : pRootOfTree; } } class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }
相關文章
相關標籤/搜索