牛客原題 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
阿新 • • 發佈:2019-02-10
/** 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 root) { if(root==null){//假如根節點為空,返回空 return null; } if(root.left==null&&root.right==null){//假如只有一個根節點,則返回根節點 return root; } //1、將左子樹構造成雙鏈表,並返回該連結串列頭結點left TreeNode left=Convert(root.left); //2、定位到左子樹連結串列的最後一個節點(左子樹最右邊的節點) TreeNode p=left;//建立一個臨時節點P,用來遍歷找到左連結串列的最後一個節點(左子樹最右邊的節點),p初始化指向做左子樹的根節點, while(p!=null&&p.right!=null){ p=p.right;//最終p為左子樹最右邊的節點 } //3、如果左子樹連結串列不為空,將當前root追加到左子樹連結串列後 if(left!=null){//左子樹連結串列不為空 p.right=root;//左子樹連結串列的最後一個節點p(左子樹最右邊節點)的右指標指向當前root節點 root.left=p;//當前root節點的左指標指向左子樹連結串列的最後一個節點p(左子樹最右邊節點) } //4、將右子樹構造成雙鏈表,並返回該連結串列的頭結點right TreeNode right=Convert(root.right); //5、如果右子樹連結串列不為空,將右子樹連結串列追加到當前root後 if(right!=null){//右子樹連結串列不為空 right.left=root;//右子樹連結串列的頭結點right的左指標指向當前root root.right=right;//當前root的右指標指向右子樹連結串列的頭結點right } return left!=null?left:root;//根據左子樹連結串列是否為空返回整個雙向連結串列的頭指標。 } }