1. 程式人生 > >二叉搜尋樹與雙向連結串列(思路與實現)

二叉搜尋樹與雙向連結串列(思路與實現)

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成一個排序的雙向連結串列。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

思路:

利用一個棧實現二叉樹的中序遍歷,題中說這是一顆二叉樹,那麼二叉樹的中序遍歷是一個有順序的,  那麼這個時候只需要在中序遍歷的時候當找到一個遍歷節點的時候先將這個節點儲存起來,然後遍歷下一個節點的時候將之前儲存的節點的right域指向下一個結點,下一個結點的left域指向上一個結點。這樣一來就形成了一個排序的雙向連結串列。然後將之前指向儲存的指標指向當前這個結點。

實現:

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
import java.util.Stack;
public class Solution {
    
    /*
        其實這是一個TreeNode的遍歷,利用一個棧實現二叉樹的中序遍歷,題中說這是一顆二叉樹,那麼二叉樹的中序遍歷是一個有順序的,
        那麼這個時候只需要在中序遍歷的時候當找到一個遍歷節點的時候將這個節點儲存起來,然後遍歷下一個節點的時候將儲存的節點的right域指向
        下一個結點,下一個結點的left域指向上一個結點。這樣一來就形成了一個排序的雙向連結串列
    */
    public TreeNode Convert(TreeNode pRootOfTree) {
	        Stack<TreeNode> stack = new Stack<TreeNode>();
	        TreeNode current = pRootOfTree;
	        TreeNode node = null;
	        TreeNode retRoot = null;
	        while(current != null || !stack.isEmpty()){
	            if(current != null){
	                stack.push(current);
	                current = current.left;
	            }else{
	                current = stack.pop();
	                if(node == null){
	                   node = current;
	                   retRoot = node;
	                }else{
	                    node.right = current;
	                    current.left = node;
	                    node = node.right;
	                    
	                }
	                current = current.right;  
	                
	            }
	            
	        }
	        return retRoot;
	    }
}