//前序遍历和中序遍历得出二叉树,然后计算叶子节点的数目
public class FrontMid {
public static TreeNode reTree(int[] pre,int[] mid) {
if(pre == null || mid == null || pre.length == 0|| mid.length == 0) {
return null;
}
return Tree(pre,0,pre.length - 1,mid,0,mid.length - 1);
}
public static TreeNode Tree(int[] pre,int ps,int pe,int[] mid,int ms,int me) {
if(ps > pe) {
return null;
}
int data = pre[ps];//前序遍历的第一个节点是根节点
int index = ms;
while(ms < me && data != mid[index]) {//中序遍历小于根节点的为左子树的节点
index++;
}
TreeNode node = new TreeNode(data);
//前序遍历的左子树 ps + 1到 ps + index - ms 后续遍历的左子树 ms 到 index - 1
node.left = Tree(pre,ps + 1,ps + index - ms,mid,ms,index - 1);
//前序遍历的右子树 ps + index - ms + 1到pe 后序遍历的柚子西湖 index + 1到me
node.right = Tree(pre,ps + index - ms + 1,pe,mid,index + 1,me);
return node;//返回的是根节点
}
//计算叶子结点的数目
public static int leaf(TreeNode root) {
if(root != null) {
if(root.right == null && root.left == null) {
return 1;
}
return leaf(root.left) + leaf(root.right);
}
return 0;
}
}
剑指offer-由前序中序遍历重建二叉树
最新推荐文章于 2020-12-09 13:39:59 发布