劍指offer(20)二叉搜索樹與雙向表
阿新 • • 發佈:2019-03-06
定義 節點 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)二叉搜索樹與雙向表