二叉树遍历的应用(递归!递归!递归!)
在学习《数据结构》中二叉树这块的时候,能很好地帮助我们学习递归思想,
本文就二叉树的遍历的递归思想,写点二叉树的常见性质题(什么高度,同构,叶子节点各种乱七八糟~ps:其实我只是想备考下期末考!)
二叉树定义:
typedef char ElemType;
typedef struct BiNode
{
ElemType data;
struct BiNode *Left;
struct BiNode *Right;
}BiNode, *BiTree;
二叉树高度:
int height(BiTree T)
{
if (!T)return 0;
//递到最后 空节点高度为0.
return 1 + max(height(T->Left), height(T->Right));
//高度=1+max(左,右),有没有后序遍历的思想呢?
}
判断两个二叉树是否相同:
int IsSame(BiTree T1, BiTree T2)
{
if (T1 == NULL&&T2 == NULL)
return 1;
if (T1 == NULL || T2 == NULL))//肯定有个不为空了。
return 0;
if (T1->Data != T2->Data)//为啥要设置这三个基础条件。一定要自己想清楚。
return 0;
return (IsSame(T1->Left, T2->Left) && IsSame(T1->Right, T2->Right));
}
判断两个二叉树是否同构(左右可以交换):
int IsSame(BiTree T1, BiTree T2)
{
if (T1 == NULL&&T2 == NULL)
return 1;
if ((T1 == NULL&&T2 != NULL) || (T1 != NULL&&T2 == NULL))//这样写就是啰嗦咯!
return 0;
if (T1->Data != T2->Data)//为啥要设置这三个基础条件。一定要自己想清楚。
return 0;
return (IsSame(T1->Left, T2->Left) && IsSame(T1->Right, T2->Right)||IsSame(T1->Left, T2->Right) && IsSame(T1->Left, T2->Right));
);
}
计算叶子节点的数量:
int sum=0;
int leafnum(BiTree T)
{
if (T)
{
if (!T->Left && !T->Right)sum++;
leafnum(T->Left);
leafnum(T->Right);
}
}
判断完全二叉树:
bool IsCompleteTree(BiTree root)
{
if (root == NULL)
return true;
BiTree tmp = NULL;
queue q;
q.push(root);
while (tmp = q.front())//层序遍历,遇到空节点停下来
{
q.push(tmp->Left);
q.push(tmp->Right);
q.pop();
} while (!q.empty())//如果是完全二叉树,当二叉树遍历完的时候,才会出现空节点。如果空节点后面还有节点,那就是非完全二叉树了。
{
tmp = q.front();
if (tmp != NULL)
return false;
q.pop();
}
return true;
}//如果是让判断是否为满二叉树,怎么判断?加计数器!
判断B节点是否为A节点的祖先节点:
bool Judge(BiTree A, BiTree B)
{
if (!B->Left && !B->Right)return false;
if (B->Left == A || B->Right == A)return true;
return(Judge(A, B->Left) || Judge(A, B->Right));
}
交换左右子树:
void ReverseLeftRightChild(BiTree T)
{
// 如果是叶子节点,则递归结束
if (T == NULL)
return;
swap(T->Left, T->Right);
// 直接使用swap交换函数比较方便,直接交换指针;
ReverseLeftRightChild(T->Left);
ReverseLeftRightChild(T->Right);
}
求二叉树的宽度:(求这玩意儿有用吗?考察层序遍历~!)
int width(BiTree T)
{if (!T)return 0;
BiTree q[100];
//队列
int front = 0, rear = 0;
//队头指针,队尾指针
int last = 0;
//同一层最右结点在队列中位置
int temp = 0, maxw = 0;
//当前层宽度与最大宽度
q[rear] = T;
BiTree p;
while (front <= last)
{
p = q[front++];
//出队
temp++;
//同层元素加1;
if (p->Left)q[rear++] = p->Left;
//入队
if (p->Right)q[rear++] = p->Right;
//入队
if (front>last)//一层结束
{
last = rear;
if (temp>maxw)maxw = temp;
//更新最大宽度
temp = 0;
}
}
return maxw;
}
还有好多问题利用三种遍历就可以直接得出了,什么求节点总数,打印叶子节点~~~!
【二叉树遍历的应用(递归!递归!递归!)】
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- java中如何实现重建二叉树
- 种树郭橐驼传(文言句式+古今异义+词类活用+通假字)
- 白杨树
- 08黑龙江迟淑荣弯柳树网络学院第五期学习赵宗瑞老师主讲的(传统文化与身心健康)教育体系心得体会
- [原创]能见沂山一棵树,胜读十年无用书!
- 涵养字外功
- 2018.07.07《刺杀骑士团长》村上春树
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- 撒哈拉沙漠-三毛