26.二叉搜索樹與雙向鏈表
阿新 • • 發佈:2019-04-24
lin 分析 不能 雙向 鏈表 序列 queue oid !=
題目描述:
??輸入一棵二叉搜索樹,將該二叉搜索樹轉換成一個排序的雙向鏈表。要求不能創建任何新的結點,只能調整樹中結點指針的指向。
思路分析:
??要將二叉搜索樹轉換為一個排序的雙向鏈表,且不能創建新的節點。首先要求是排序的,那麽由於二叉搜索樹的特殊性,只要我們中序遍歷二叉樹,就能得到有序序列,然後我們可以將每個節點的指向左右孩子的指針,改成指向前節點和後節點。這樣就可以實現題目要求,我們可以先用隊列保存中序遍歷後節點的順序。然後改變每個節點的left,right指針,得到排序的雙向鏈表。
代碼:
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ import java.util.*; public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { //第一步;先將中序遍歷的節點保存在隊列中 Queue<TreeNode>q=new LinkedList<>(); saveNodes(pRootOfTree,q); if(q.isEmpty()) return null; TreeNode pNode=q.poll(); TreeNode root=pNode; //保存鏈表頭 TreeNode pre=pNode; pre.left=null; //鏈表頭的前指針為空 while(!q.isEmpty()){ pNode=q.poll(); pre.right=pNode; pNode.left=pre; pre=pNode; } return root; } public void saveNodes(TreeNode root,Queue<TreeNode>q){ if(root!=null){ saveNodes(root.left,q); q.offer(root); saveNodes(root.right,q); } } }
26.二叉搜索樹與雙向鏈表