数据结构(C语言版)严蔚敏---二叉树遍历操作二叉树的相关代码
Posted 坚持不懈的大白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(C语言版)严蔚敏---二叉树遍历操作二叉树的相关代码相关的知识,希望对你有一定的参考价值。
1. 二叉树的自下而上、从左到右的层次遍历算法
void LevelTraverse2(BiTree T)
BiTree Queue[100],Stack[100];
// 这里用数组代替队列和栈
int i=0,i1=0,j=0;
Queue[0] = T;
while(i1<=i)
T = Queue[i1++];
Stack[j++] = T;
if(T->left)
Queue[++i] = T->left;
if(T->right)
Queue[++i] = T->right;
while(j>0)
T = Stack[--j];
printf("%c",T->data);
printf("\\n");
【注意】代码中使用数组代替队列和栈。
运行结果如下:
所表示的二叉树为:
使用队列和栈的参考代码为:
void LevelTraverse2(BiTree T)
Queue Q;
Stack S;
BiTree p;
// 定义队列和栈
//初始化队列和栈
if(T)
// 二叉树非空时
InitQueue(Q);
InitStack(S);
EnQueue(Q,T);
// 入队
while(!IsQueueEmpty(Q))
DeQueue(Q,p);
// 出队
Push(S,p);
// 入栈
if(p->lchild)
EnQueue(Q,p->lchild);
// 左孩子非空
if(p->rchild)
EnQueue(Q,p->rchild);
while(!IsStackEmpty(S))
Pop(S,p);
// 出栈
printf("%c",p->data);
思路为:利用原有的层次遍历算法(从上至下、从左至右),出队的同时将各节点入栈,在所有节点入栈后再从栈顶依次访问即可。
2.非递归算法求二叉树的高度
int BitDepth(BiTree T)
if(!T)
return 0;
// 如果二叉树为空
int f = 0,r = 0;
int level = 0,last = 1;
BiTree Queue[100];
Queue[r++] = T;
BiTree p;
while(f<r)
p = Queue[f++];
if(p->left)
Queue[r++] = p->left;
if(p->right)
Queue[r++] = p->right;
if(last == f)
level++;
last = r;
return level;
运行结果(所用的二叉树和上述一样):
思路:采用层次遍历算法,设置变量level记录当前节点所在的层次,设置变量last指向当前层的最右节点,每次层次遍历出队时与last指针比较,若两者相同,则层数加1,并让last指向下一层的最右节点,直到遍历完成。
3. 线索二叉树的先序遍历
参考代码
main.cpp
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
typedef struct ThreadNode
ElemType data;
struct ThreadNode *lchild,*rchild;
int ltag,rtag;
ThreadNode,*ThreadBiTree;
// 先序线索二叉树的构建
void PreThread(ThreadBiTree &T,ThreadBiTree &pre)
if(T!=NULL)
if(T->lchild == NULL)
T->lchild = pre;
T->ltag = 1;
if(pre!=NULL && pre->rchild == NULL)
pre->rchild = T;
pre->rtag = 1;
pre = T;
if(T->ltag == 0)
PreThread(T->lchild,pre);
PreThread(T->rchild,pre);
void CreatePreThread(ThreadBiTree &T)
ThreadNode *pre = NULL;
if(T!=NULL)
PreThread(T,pre);
if(pre->rchild == NULL)
pre->rtag = 1;
void CreateBiTree(ThreadBiTree &T)
ElemType c;
c = getchar();
if(c == '#')
T = NULL;
else
T = (ThreadNode *)malloc(sizeof(ThreadNode));
T->data = c;
T->ltag = 0;
T->rtag = 0;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
ThreadNode * NextNode(ThreadBiTree T)
if(T->ltag == 0) return T->lchild;
else
return T->rchild;
void PreOrder(ThreadBiTree T)
for(ThreadNode *p = T;p!=NULL;p=NextNode(p))
printf("%c",p->data);
int main()
ThreadBiTree T;
CreateBiTree(T);
CreatePreThread(T);
PreOrder(T);
return 0;
运行结果:
【注】:表示的二叉树为1相同
【注】:表示的二叉树的先序遍历为:abcdf,中序遍历为:cbdaf
4. 求孩子兄弟表示法存储的森林(树)的叶子节点数
思路:其实就是求孩子兄弟表示法表示的二叉树中左孩子指针(左孩子指针表示当前节点的第一个孩子)为空的节点个数。
参考代码:
main.cpp
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;
// 树的孩子兄弟表示法
typedef struct CSNode
ElemType data;
struct CSNode *firstchild,*nextsibling;
CSNode,*CSTree;
void CreateCSTree(CSTree &T)
char ch;
ch = getchar();
if(ch == '#')
T = NULL;
else
T = (CSNode *)malloc(sizeof(CSNode));
T->data = ch;
CreateCSTree(T->firstchild);
CreateCSTree(T->nextsibling);
int getLeafNodes(CSTree T)
if(T == NULL)
return 0;
if(T && T->firstchild == NULL)
return 1 + getLeafNodes(T->nextsibling);
else
return getLeafNodes(T->firstchild) + getLeafNodes(T->nextsibling);
int main()
CSTree T;
CreateCSTree(T);
// 创建树
int num = getLeafNodes(T);
printf("树的叶子节点个数为:%d",num);
return 0;
运行结果:
【注】:运行结果表示的是一棵树,不是森林,表示的树如下:
【注】:表示的为森林,表示的森林如下:
以上是关于数据结构(C语言版)严蔚敏---二叉树遍历操作二叉树的相关代码的主要内容,如果未能解决你的问题,请参考以下文章
数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树
数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树
数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树
数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树