1. 程式人生 > >Leetcode---從前序與中序遍歷序列構造二叉樹--思路

Leetcode---從前序與中序遍歷序列構造二叉樹--思路

從前序與中序遍歷序列構造二叉樹

題目連結:從前序與中序遍歷序列構造二叉樹

解題思路:
  • 從遍歷序列構造二叉樹時,必須包含有中序遍歷,先序和後序是構造不了的
  • 方法:首先找先序的第一個節點,它一定是樹的根節點,然後在中序序列中找到該節點的位置,左邊即為該節點的左子樹遍歷序列,右邊則為右子樹遍歷序列
  • 再去構造子樹時,我們發現典型的遞迴構造
  • 那麼構造單獨一個節點時,我們需要的是什麼?只需要當前遍歷的先序序列的節點(可以用陣列和下標來表示),中序序列中的部分序列(這棵子樹在中序序列中的範圍,用中序序列和front,rear下標表示即可)
  • front>rear時表明該樹為空,相等時表示該樹僅有一個節點,其餘情況應當繼續遞迴,程式碼如下:
public TreeNode buildTree(int[] preorder, int[] inorder) {
		
		int front = 0,rear = preorder.length-1,index = 0;
		return buildTree(inorder,front,rear,preorder,index);
    }
	TreeNode buildTree(int[] inorder, int front,int rear,int[] preorder,int index) {
		
		if(front>rear) {
			//當前節點應當為空
			return
null; }else if(front==rear) { //只含有一個根節點 return new TreeNode(inorder[front]); } //在front到rear範圍內遍歷inorder[i] = preorder[index] int mid = 0; for(int i = front;i<=rear;i++) { if(inorder[i]==preorder[index]) { mid = i; break; } } int front1 = front,rear1 = mid-1,front2 =
mid+1,rear2 = rear; //構造當前節點 TreeNode node = new TreeNode(inorder[mid]); //構造左子樹 node.left = buildTree(inorder,front1,rear1,preorder,index+1); //構造右子樹 node.right = buildTree(inorder,front2,rear2,preorder,index+rear1-front1+2); return node; }