题目列表:
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("\n"); } return 0; }
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