面试中的二叉树题目

题目列表:

1. 求二叉树中的节点个数

  DFS遍历时记录点的个数
2. 求二叉树的深度

  DFS遍历时记录点的最大
3. 前序遍历,中序遍历,后序遍历

  三种DFS

4.分层遍历二叉树(按层次从上往下,从左往右)

  BFS
5. 将二叉查找树变为有序的双向链表

  先建树,在中序遍历即可

//1
//4 2 1 0 0 3 0 0 6 5 0 0 7 0 0

#include<stdio.h>

struct Tree{
    int v;
    Tree *left,*right;
}*rhead;

void build(Tree *head){
    int temp;
    scanf("%d",&temp);
    if(temp==0){
        head->v=0;
        head->left=NULL;
        head->right=NULL;
    }else{
        head->v=temp;
        head->left=new Tree;
        build(head->left);
        head->right=new Tree;
        build(head->right);
    }
}

int step;
int road[100999];
void First(Tree *head){
    
    if(head->v==0)return ;
    First(head->left);
    step++;
    road[step]=head->v;
    First(head->right);
}

int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        rhead=new Tree;
        build(rhead);
        step=0;
        First(rhead);
        int i,ok=0;
        for(i=1;i<=step;i++){
            if(ok==0)ok=1;
            else printf(" ");
            printf("%d",road[i]);
        }printf("
");
    }

    return 0;
}
View Code

6. 求二叉树第K层的节点个数

  DFS记录 step==K 时有几个结点
7. 求二叉树中叶子节点的个数

  DFS记录没有儿子的结点有几个
8. 判断两棵二叉树是否结构相同

  同时DFS遍历两棵树观察是否相同
9. 判断二叉树是不是平衡二叉树

  平衡二叉树的定义是左右子树的高度差不超过1,DFS遍历判断左右子树高度是否都相差1
10. 求二叉树的镜像

  同时遍历两棵树,一颗遍历左子树的时候副本遍历右子树依次复制结点信息,反之亦然。
11. 求二叉树中两个节点的最低公共祖先节点

  先判断两个点是否在树中,若不是则直接就找不到

  若在树中,则DFS搜索连个点所在的路径,搜到了两个路径,在找两个路径最开始的相同点,也就是最近祖先结点

12. 求二叉树中节点的最大距离

统计所有左右子树的高度+2的最大值即可

int max=0;
void DFS(Tree *head){
    if(head==NULL)return 0;
    int add=2+DFS(head->left)+DFS(head->right);
    if(max<add) max=add;              
}

13. 由前序遍历序列和中序遍历序列重建二叉树

  http://www.cnblogs.com/huhuuu/p/3347700.html 类似

  就是不断将前序中的一个个结点代到中序遍历的树中,逐渐生成一棵树
14.判断二叉树是不是完全二叉树

   不用指针表示,用数字下标表示树所在的位置,树高K,统计i:1~(k-1)层对应的结点个数是否是 2^(i-1)如果是,再对下标为2^(k-2) ~2^(k-1)-1 所在的树统计儿子的结点个数是否依次是 2 2 ……2 0……0 或是 2 2…… 2 1 0……0的的形式,若是则为完全二叉树

需要比较详细的答案可以参考:http://blog.csdn.net/luckyxiaoqiang/article/details/7518888

原文地址:https://www.cnblogs.com/huhuuu/p/3391323.html