1. 程式人生 > >LeetCode105題:從前序和中序遍歷序列構造二叉樹

LeetCode105題:從前序和中序遍歷序列構造二叉樹

思路: 

首先要清楚二叉樹的前序遍歷和中序遍歷的過程。所謂的前序遍歷,其遍歷順序為:當前節點-->左子樹-->右子樹;而中序遍歷的遍歷順序為:左子樹-->當前節點-->右子樹。因此,中序遍歷序列中某一節點的左右兩側則分別為其左右子樹。這樣思路就出來了,先在前序遍歷序列中設定當前節點,然後在中序遍歷序列中遍歷找到當前節點,然後對其左右子樹(即左右兩側的區域性序列)分別進行遞迴呼叫即可。

對於遞迴問題,關鍵是確定什麼時候遞迴以及什麼時候結束遞迴。對於此問題,進行遞迴的條件就是當在中序遍歷序列中找到當前節點時即進行遞迴;而結束遞迴的條件稍微難確定一點,對於不同的程式碼可能有所區別。我這裡是當中序遍歷的區域性子序列長度小於等於1時結束遞迴,這時候說明當前節點沒有左子樹或沒有右子樹。

class Solution {

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return helpBuild(preorder, inorder, 0, 0, inorder.length);
    }

    public static TreeNode helpBuild(int[] pre,int[] in,int preIndex,int inFrom,int inTo){
		if(inFrom >= inTo){//說明左子樹或右子樹為空
			return null;
		}
		TreeNode root = new TreeNode(pre[preIndex]);
		for(int i=inFrom;i<inTo;i++){//中序序列尋找當前節點
			if(in[i] == pre[preIndex]){
				root.left = helpBuild(pre, in, preIndex + 1, inFrom, i);//對左子樹進行遞迴
				root.right = helpBuild(pre, in, preIndex + i - inFrom + 1, i+1, inTo);
                break;
			}
		}
		return root;
	}