[劍指offer] --26.二叉搜尋樹與雙向連結串列
阿新 • • 發佈:2018-11-15
題目描述
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { } }
解題思路
- 1.將左子樹構造成雙鏈表,並返回連結串列頭節點。
- 2.定位至左子樹雙鏈表最後一個節點。
- 3.如果左子樹連結串列不為空的話,將當前root追加到左子樹連結串列。
- 4.將右子樹構造成雙鏈表,並返回連結串列頭節點。
- 5.如果右子樹連結串列不為空的話,將該連結串列追加到root節點之後。
- 6.根據左子樹連結串列是否為空確定返回的節點。
public 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; } public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } }