(不懂)二叉搜尋樹與雙向連結串列
阿新 • • 發佈:2019-09-12
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
public class Solution { private TreeNode pre = null; //上一個節點 private TreeNode head = null; //當前節點 public TreeNode Convert(TreeNode root) { inOrder(root); return head; } private void inOrder(TreeNode node) { //輸入一個 node if (node == null) //判空 return; inOrder(node.left); // 左孩子遞迴 node.left = pre; // 上個節點賦值給 left if (pre != null) //如果上個節點不為空 pre.right = node; //node 給 pre = node; if (head == null) head = node; inOrder(node.right); } }
解題思路: 1.核心是中序遍歷的非遞迴演算法。 2.修改當前遍歷節點與前一遍歷節點的指標指向。 import java.util.Stack; public TreeNode ConvertBSTToBiList(TreeNode root) { if(root==null) //判空 return null; Stack<TreeNode> stack = new Stack<TreeNode>(); //使用系統的棧 TreeNode p = root; //當前的節點宣告變數 p TreeNode pre = null;// 用於儲存中序遍歷序列的上一節點 boolean isFirst = true; //宣告一個 boolean 變數,初始值為 true while(p!=null||!stack.isEmpty()){ // 當 p 不為空或者 棧不為空時,迴圈 while(p!=null){ // 當 p 不為空時, stack.push(p); // 新增元素的方法push(),新增到棧裡 p = p.left; //把 p 的左孩子賦值給 p } p = stack.pop(); //當遍歷到葉子節點時,即 p 為 空,彈出棧的棧頂元素,賦值為 p if(isFirst){ root = p;// 將中序遍歷序列中的第一個節點記為root pre = root; isFirst = false; }else{ pre.right = p; p.left = pre; pre = p; } p = p.right; } return root; }
對於當前結點,先輸出它的左孩子,然後輸出該結點,最後輸出它的右孩子。(left—