数据结构:二叉树的遍历

博客围绕二叉树展开,介绍了树的度、二叉树的性质,如节点数与深度关系等。阐述了二叉树的顺序和链式存储结构,以及先序、中序、后序三种遍历方式,包括中序的递归与非递归操作。还说明了遍历算法在创建、复制二叉树,计算深度和统计节点数等方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、树的性质

1、树的度:树的度是树内各节点中度的最大值。
2、二叉树的性质
  • 在二叉树的第i层上之多有2i-1个结点(i >= 1)。
  • 深度为k的二叉树至多有2k-1个结点。
  • 对于任何一棵二叉树T,如果其终端节点数为n0,度为2的结点数为n2,则:n0 = n2 + 1;
  • 满二叉树:深度为k,且含有2k-1个结点的二叉树。
  • 完全二叉树:深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应,称之为完全二叉树。
  • 具有n个结点的完全二叉树的深度为log2n + 1。
  • 如果对任一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i(1 <= i <= n),有:
    当i=1时,其为根节点;如果i>1,则其双亲结点为 i/2 取下;
    当2i > n时,则结点i没有 左孩子,否则2i为结点i的左孩子;
    当2i+1 > n时,则结点i没有 右孩子,否则2i+1 为结点i的右孩子;

二、二叉树的存储结构

1、顺序存储
#define MAXSIZE 100
typedef TElemType sqBiTree[MAXSIZE];
sqBiTree bt;
2、链式存储
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

三、二叉树的遍历

1、先序遍历

parent -> lchild -> rchild

void PostOrderTraverse(BiTree T){
if(T){
cout<<T->data;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
}
}
2、中序遍历
2.1 递归操作

lchild -> parent -> rchild

void InOrderTraverse(BiTree T){
if(T){
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
2.2 非递归操作
void InOrderTraverse(BiTree T){
InitStack(S); //初始化一个栈
p = T; 
q = new BiTNode;
while(p || !StackEmpty(S)){
if(p){
Push(S,p); //遍历结点p
p = p->lchild; //准备遍历结点p的左孩子
}
else{ //如果p的左孩子为空
Pop(S,q); //将栈顶元素pop出(p)
cout<<q->data; //输出该元素
p=q->rchild; //遍历p的右孩子
}
}
}
3、后序遍历

lchild -> rchild -> parent

void PreOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
cout<<T->data;
}
}

给定一棵树的序列:BDCEAFHG,只能通过“先序和中序遍历” 或者 “后序和中序遍历” 获得树的结构。
“先序和后序遍历” 不能获得树的结构。

四、二叉树遍历算法的应用

1、利用先序遍历 创建 二叉树
//当输入为 '#' 时,表示输入结束。
void CreateBiTree(BiTree &T){
cin>>ch;
if(ch == '#'){T=NULL;}
else{
T=new BiTNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
2、利用先序遍历 复制二叉树
//利用先序遍历 复制二叉树
void Copy(BiTree T,BiTree &NewT){
if(!T){
NewT = NULL;
return;
}
else{
NewT=new BiTNode;
NewT->data = T->data;
Copy(T->lchild,NewT->lchild);
Copy(T->rchild,NewT->rchild);
}
}
3、计算二叉树的深度
int Depth(BiTree T){
if(!T){return 0;}
else{
m = Depth(T->lchild);
n = Depth(T->rchild);
if(m>n){return (m+1);}
else{return (n+1);}
}
}
4、统计二叉树中结点个数
int NodeCount(BiTree T){
if(!T){return 0;}
else{
m = NodeCount(T->lchild);
n = NodeCount(T->rchild);
return (m+n+1);
}
}

参考资料:《数据结构》 严蔚敏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sarah ฅʕ•̫͡•ʔฅ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值