书籍二叉树问题

二叉树节点间的最大距离问题

题目:

从二叉树的节点A出发,可以向上或者向喜爱走,但沿途的节点只能经过一次,当到达节点B时,路径上的节点数叫作A到B的距离。

解答:

主要是利用二叉树的遍历,进行处理。

一个以h为头的树上,最大距离只可能来自以下三种情况。

h的左子树上的最大距离

h的右子树上的最大距离

h左子树上离h.left最远的距离+1(h)+h右子树上离h.right最远的距离。

public int maxDistance(Node head){

    int[] record  = new int[1];
    return posOrder(head,record);

}


public int posOrder(Node head,int[] record){

     if(head == null){
        record[0] = 0;
        return 0;
     }
    int lMax = posOrder(head.left,record);
    int maxfromLeft = record[0];
    int rMax = posOrder(head.right,record);
    int maxFromRight = record[0];
    int curNodeMax = maxfromLeft + maxFromRight + 1;
    record[0] = Math.max(maxfromLeft,maxFromRight) + 1;
    return Math.max(Math.max(lMax,rMax),curNodeMax);
}

先序、中序和后序数组两两结合重构二叉树

题目:

已知一棵二叉树的所有节点值都不同,给定这棵二叉树正确的先序、中序和后序数组。

请分别用三个函数实现任意两种数组结合重构原来的二叉树,并返回重构二叉树的头节点。

先序和中序结合
public Node preIntoTree(int[] pre,int[] in){
    if(pre == null || in == null){
        return null;
    }
    
    HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
    for(int i = 0;i<in.length;i++){
        map.put(in[i],i);
    }
    return preIn(pre,0,pre.length - 1,in,0,in.length - 1,map);
}

public Node preIn(int[] p,int pi,int pj,int[] n,int ni,int nj,HashMap<Integer,Integer> ,map){

    if(pi>pj){
        return null;
    }
    Node head = new Node(p[pi]);
    int index = map.get(p[pi]);
    head.left = preIn(p,pi+1,pi+index-ni,n,ni,index-1,map);
    head.right = preIn(p,pi+index-ni+1,pj,n,index+1,nj,map);
    return head;
}
中序和后序结合
public Node inPosToTree(int[] in,int[] pos){
    if(in == null || pos == null){
        return null;
    }
    HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
    for(int i = 0;i < in.length;i++){
        map.put(in[i],i);
    }
    return inPos(in,0,in,length - 1,pos,0,pos.length - 1,map);
}


public Node inPos(int[] n,int ni,int nj,int[] s,int si,int sj,HashMap<Integer,Integer> map)
    if(si>sj){
        return null;
    }
    Node head = new Node[s[sj]];
    int index = map.get(s[sj]);
    head.left = inPos(n,ni,index-1,s,si,si+index-ni-1,map);
    head.right = inPos(n,index+1,nj,s,si+index-ni,sj-1,map);
    return head;

}
先序和后序结合重构二叉树,要求面试者首先分析出节点值都不同的二叉树
public Node prePosToTree(int[] pre,int[] pos){
    if(pre == null || pos == null){
        retrun null;
    }
    HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
    for(int i = 0;i<pos.length;i++){
        map.put(pos[i],i);
    }
    return prePos(pre,0,pre.length - 1,pos,0,pos.length - 1,map);
}


public Node prePos(int[] p,int pi, int pj,int[] s,int si,int sj,HashMap<Integer,Integer> map ){
    Node head = new Node(s[sj--]);
    if(pi == pj){
        return head;
    }

    int index = map.get(p[++pi]);
    head.left = prePos(p,pi,pi+index-si,s,si,index,map);
    head.right = prePos(p,pi+index-si+1,pj,s,index+1,sj,map);
    return head;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值