数据结构二叉树的基本运算算法的设计与实现 20

1)根据二叉树的括号表示法str建立二叉链存储结构b。(2)求二叉树b的高度。(3)求二叉树b的叶子结点个数。(4)求二叉树b的结点个数。(5)输出二叉树b的先序、中序、... 1)根据二叉树的括号表示法str建立二叉链存储结构b。(2)求二叉树b的高度。(3)求二叉树b的叶子结点个数。(4)求二叉树b的结点个数。(5)输出二叉树b的先序、中序、后序遍历序列(6)根据图中二叉树的先序和中序遍历序列构造出该二叉树的二叉链表,并用括号表示法进行输出。
用C语言编写
展开
 我来答
匿名用户
2018-10-29
展开全部
一、二叉树存储结构
1)二叉树的顺序存储结构
二叉树的顺序存储结构中节点的存放次序是:对该树中每个节点进行编号,其编号从小到大的顺序就是节点存放在连续存储单元的先后次序。
若把二叉树存储到一维数组中,则该编号就是下标值加1(注意C/C++语言中数组的起始下标为0)。
树中各节点的编号与等高度的完全二叉树中对应位置上节点的编号相同。
定义为:typedef ElemType SqBTree[MaxSize];
顺序二叉树,如下图:
字符串:SqBTree bt="#ABD#C#E######F";
2)二叉树的链式存储结构
在二叉树的链接存储中,节点的结构如下:
typedef struct node
{ ElemType data;
struct node *lchild,*rchild;
} BTNode;
其中,data表示值域,用于存储对应的数据元素,lchild和rchild分别表示左指针域和右指针域,用于分别存储左孩子节点和右孩子节点(即左、右子树的根节点)的存储位置。
二、二叉树的基本运算及其实现
归纳起来,二叉树有以下基本运算:
(1)创建二叉树CreateBTNode(*b,*str):根据二叉树括号表示法的字符串*str生成对应的链式存储结构。
用ch扫描采用括号表示法表示二叉树的字符串。
分以下几种情况:
① 若ch='(':则将前面刚创建的节点作为双亲节点进栈,并置k=1,表示其后创建的节点将作为这个节点的左孩子节点;
② 若ch=')':表示栈中节点的左右孩子节点处理完毕,退栈;
③ 若ch=‘,’:表示其后创建的节点为右孩子节点,置k=2;
④ 其他情况:
当k=1时,表示这个节点作为栈中节点的左孩子节点;
当k=2时,表示这个节点作为栈中节点的右孩子节点。如此循环直到str处理完毕。
算法中使用一个栈St保存双亲节点,top为其栈指针,k指定其后处理的节点是双亲节点(保存在栈中)的左孩子节点(k=1)还是右孩子节点(k=2)。
void CreateBTNode(BTNode * &b,char *str)
{ BTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL; //建立的二叉树初始时为空
ch=str[j];
while (ch!='\0') //str未扫描完时循环
{ switch(ch)
{
case '(':top++;St[top]=p;k=1; break;
//为左孩子节点
case ')':top--;break;
case ',':k=2; break;
//为孩子节点右节点、
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if (b==NULL) //p为二叉树的根节点
b=p;
else //已建立二叉树根节点
{ switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;ch=str[j];
}
}
(2)查找节点FindNode(*b,x):在二叉树b中寻找data域值为x的节点,并返回指向该节点的指针。
采用先序遍历递归算法查找值为x的节点。找到后返回其指针,否则返回NULL。算法如下:
BTNode *FindNode(BTNode *b,ElemType x)
{ BTNode *p;
if (b==NULL) return NULL;
else if (b->data==x) return b;
else
{ p=FindNode(b->lchild,x);
if (p!=NULL) return p;
else return FindNode(b->rchild,x);
}
}
(3)找孩子节点LchildNode(p)和Rchild-Node(p):分别求二叉树中节点*p的左孩子节点和右孩子节点。
直接返回*p节点的左孩子节点或右孩子节点的指针。算法如下:
BTNode *LchildNode(BTNode *p)
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
return p->rchild;
}
(4)求高度BTNodeDepth(*b):求二叉树b的高度。若二叉树为空,则其高度为0;否则,其高度等于左子树与右子树中的最大高度加l。
求二叉树的高度的递归模型f()如下:
f(b) = 0 b=NULL
f(b) = MAX{f(b->lchild),f(b->rchild)}+1 其他情况
int BTNodeDepth(BTNode *b)
{ int lchilddep,rchilddep;
if (b==NULL) return(0); //空树的高度为0
else
{ lchilddep=BTNodeDepth(b->lchild);
//求左子树的高度为lchilddep
rchilddep=BTNodeDepth(b->rchild);
//求右子树的高度为rchilddep
return(lchilddep>rchilddep)?
(lchilddep+1):(rchilddep+1));
}
}
(5)输出二叉树DispBTNode(*b):以括号表示法输出一棵二叉树。
用括弧表示法输出二叉树。对于非空二叉树b,先输出其元素值,当存在左孩子节点或右孩子节点时,输出一个“(”符号,然后递归处理左子树,输出一个“,”符号,递归处理右子树,最后输出一个“)”符号。
void DispBTNode(BTNode *b)
{ if (b!=NULL)
{ printf("%c",b->data);
if (b->lchild!=NULL || b->rchild!=NULL)
{ printf("(");
DispBTNode(b->lchild);
//递归处理左子树
if (b->rchild!=NULL) printf(",");
DispBTNode(b->rchild);
//递归处理右子树
printf(")");
}
}
}
---------------------
作者:kong_xz
来源:CSDN
原文:https://blog.csdn.net/kong_xz/article/details/79507531
版权声明:本文为博主原创文章,转载请附上博文链接!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式