1. 程式人生 > >劍指offer(20)二叉搜索樹與雙向表

劍指offer(20)二叉搜索樹與雙向表

定義 節點 line null set nod 轉換成 number oot

題目:

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

思路一:遞歸法 

1.將左子樹構造成雙鏈表,並返回鏈表頭節點。 2.定位至左子樹雙鏈表最後一個節點。 3.如果左子樹鏈表不為空的話,將當前root追加到左子樹鏈表。 4.將右子樹構造成雙鏈表,並返回鏈表頭節點。 5.如果右子樹鏈表不為空的話,將該鏈表追加到root節點之後。 6.根據左子樹鏈表是否為空確定返回的節點。
class Untitled {
	
	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);
		TreeNode node6 = new TreeNode(12);
		TreeNode node7 = new TreeNode(16);
		node1.setNode(node2,node3);
		node2.setNode(node4,node5);
		node3.setNode(node6,node7);
		Solution s = new Solution();
		TreeNode p = s.Convert(node1);
		while(p.right!=null){
			System.out.println(p.val);
			p = p.right;
		}
	}
	
}
	//樹的定義
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
	
	public void setNode(TreeNode node1,TreeNode node2){
		this.left = node1;
		this.right = node2;
	}

}
//解方法	
class Solution {
    public TreeNode Convert(TreeNode root) { 
        if(root==null) 
            return null; 
        if(root.left==null&&root.right==null) 
            return root; 
// 1.將左子樹構造成雙鏈表,並返回鏈表頭節點 
        TreeNode left = Convert(root.left); 
        TreeNode p = left; 
 // 2.定位至左子樹雙鏈表最後一個節點
        while(p!=null&&p.right!=null){ 
            p = p.right; 
        } 
// 3.如果左子樹鏈表不為空的話,將當前root追加到左子樹鏈表
        if(left!=null){ 
            p.right = root; 
            root.left = p; 
        } 
// 4.將右子樹構造成雙鏈表,並返回鏈表頭節點 
        TreeNode right = Convert(root.right); 
 // 5.如果右子樹鏈表不為空的話,將該鏈表追加到root節點之後 
        if(right!=null){ 
            right.left = root; 
            root.right = right; 
        } 
        return left!=null?left:root;         
    } 

}

  

劍指offer(20)二叉搜索樹與雙向表