1. 程式人生 > >二叉樹的重建

二叉樹的重建

二叉樹的重建

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode(int x) { val = x; }
}
/**
 * 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。
 * 假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。
 * 例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},
 * 則重建二叉樹並返回。
 * @author user
 *
 *
 *思路:前序遍歷的第一個數據即為根節點的數據,則在中序遍歷中進行掃描去找到根節點所在的位置,那麽
 *根據中序遍歷的特點,根節點之前即為樹的左子樹,之後即為右子樹。同樣前序遍歷中根節點之後分別為左子樹和右子樹,
 *那麽就可以找到左子樹和右子樹根節點。此時就可以使用遞歸了
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
    	//根節點
    	TreeNode rootNode = new TreeNode(pre[0]);
    	//判斷前序遍歷的長度
    	if(pre.length == 1) { //沒有子樹
    		rootNode.left = null;
    		rootNode.right = null;
    		return rootNode;
    	}
    	//獲取根節點值,即前序遍歷的第一個
    	int rootNodeVal = pre[0];
    	//在中序遍歷中查找根節點的位置
    	int j;
    	for (j = 0; j < in.length; j++) {
			if(in[j] == rootNodeVal) break;
		}
    	//構建左子樹
    	if(j > 0) { //判斷是不是沒有左子樹
    		int[] preo = new int[j];
    		int[] ino = new int[j];
    		//獲得左子樹的前序遍歷
    		for (int i = 0; i < j; i++) {
				preo[i] = pre[i+1];
			}
    		//獲得左子樹的中序遍歷
    		for (int i = 0; i < j; i++) {
				ino[i] = in[i];
			}
    		//遞歸
    		rootNode.left = reConstructBinaryTree(preo, ino);
    	} else {
    		rootNode.left = null;
    	}
    	//構建右子樹
    	if(pre.length - j - 1 > 0) { //判斷是不是沒有右子樹
    		int[] preo = new int[pre.length - j - 1];
    		int[] ino = new int[pre.length - j - 1];
    		//獲取右子樹的前序遍歷和中序遍歷
    		for(int i = j + 1; i < pre.length; i++) {
				preo[i - j -1] = pre[i];
				ino[i - j -1] = in[i];
			}
    		//遞歸
    		rootNode.right = reConstructBinaryTree(preo, ino);
    	} else {
    		rootNode.right = null;
    	}
    	return rootNode;
    }
}


本文出自 “12212886” 博客,請務必保留此出處http://12222886.blog.51cto.com/12212886/1963601

二叉樹的重建