利用二叉链表存储树
① 二叉链表存储树,根结点的右指针是空吗怎么不是指向最右孩子
以二叉链表作树的存储结构,即用孩子兄弟表示法来表示树,链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,根结点没有兄弟结点,所以右指针是空的
② 利用二叉链表存储树,则根节点的右指针是空的,这是为什么呢,谢谢
二叉链表存储树结构,那么任意节点的左孩子指向该结点的孩子结点,右孩子指针指向该节点的兄弟节点,因为这里是树,不是森林,所以树的根节点没有兄弟结点,则右指针是空。
③ 用二叉链表存储树,为什么根结点的右指针是空,数据结构
采用二叉树结构存储树或森林,即树/森林的左子右兄表示法。
二叉树中节点的左“孩子”是原树/森林对应节点的“长子节点”,右“孩子”是原树/森林对应节点的“兄弟节点”。
而树的根节点是没有兄弟的,故在二叉链表中它的右指针为空()
④ 利用二叉链表存储二叉树,则根节点的右指针为空。 为什么不是指向右孩子
题目写错了吧,应该是用二叉链表存储树(转换的二叉树),则根结点的右指针为空
⑤ 采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作
#include<iostream>
#include<cstdio>
#include<stdlib.h>
using namespace std;
typedef int Elemtype;
typedef struct BiTnode
{
Elemtype data;//数据域
struct BiTnode* Lchild,*Rchild; //左右子树域;
}BiTnode,*BiTree;
int create(BiTree *T)
{
Elemtype ch;
Elemtype temp;
scanf("%d",&ch);
temp=getchar();
if(ch==-1)
{
*T=NULL;
}
else
{
*T=(BiTree)malloc(sizeof(BiTnode) );
if(!(*T))
{
exit(-1);
}
else
{
(*T)->data=ch;
printf("请输入%d的左节点的值",ch);
create(&(*T)->Lchild);
printf("请输入%d的右节点的值",ch);
create(&(*T)->Rchild);
}
}
return 1;
}
void Traverse(BiTree T)//前序遍历二叉树
{
if(NULL==T)
{
return;
}
else
{
printf("%d ",T->data);
Traverse(T->Lchild);
Traverse(T->Rchild);
}
}
//中序遍历二叉树
void midTraverse(BiTree T)
{
if(T==NULL){return;}
midTraverse(T->Lchild);
printf("%d ",T->data);
midTraverse(T->Rchild);
}
//后序遍历二叉树
void lasTraverse(BiTree T)
{
if(T==NULL){return;}
lasTraverse(T->Lchild);
lasTraverse(T->Rchild);
printf("%d ",T->data);
}
//求二叉树的深度
int TreeDeep(BiTree T)
{
int deep=0;
if(T)
{
int leftdeep=TreeDeep(T->Lchild);
int rightdeep=TreeDeep(T->Rchild);
deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1;
}
return deep;
}
//求二叉树叶子节点个数
int Leafcount(BiTree T,int &num)
{
if(T)
{
if(T->Lchild==NULL&&T->Rchild==NULL)
{
num++;
}
Leafcount(T->Lchild,num);
Leafcount(T->Rchild,num);
}
return num;
}
int main()
{
BiTree T;
BiTree *p=(BiTree*)malloc(sizeof(BiTree));
int deepth=0,num=0;
printf("请输入第一个节点的值,-1代表没有叶节点: ");
create(&T);
printf("先序遍历二叉树: ");
Traverse(T);
printf(" ");
printf("中序遍历二叉树: ");
midTraverse(T);
printf(" ");
printf("后序遍历二叉树: ");
lasTraverse(T);
printf(" ");
deepth=TreeDeep(T);
printf("树的深度:%d ",deepth);
printf(" ");
Leafcount(T,num);
printf("二叉树的叶子节点个数为:%d ",num);
printf(" ");
return 0;
(5)利用二叉链表存储树扩展阅读:
二叉链表是树的二叉链表实现方式。
树的二叉链表实现方式:(孩子兄弟表示法)
以二叉链表作为树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点。
结构描述:
typedefstruct CSNode{
ElemType data;
struct CSNode *firstchild , *netsibling;
} CSNode,* CSTree;
由于二叉树的存储结构比较简单,处理起来也比较方便,所以有时需要把复杂的树,转换为简单的二叉树后再作处理。
⑥ 利用二叉链表存储树,则根结点的右指针是 为什么答案不是右孩子是空
因为存的是一般树,二叉链表储存要先化成二叉树,根节点没有兄弟,右指针为空
⑦ 运用C++如何使用二叉链表存储二叉树,遍历输出叶子节点路径,递归输出叶子节点值,输出树的深度
构造的二叉树结构如下:
⑧ 用二叉链表存储包含N个结点的二叉树,结点的2N个指针域中有N+1个空指针
首先
二叉树的节点都有2个指针。每个节点有0个、1个或2个空指针。对应的有2个、1个、0个非空指针。非空指针的总数就是二叉树的边的个数。
设一个二叉树x个节点含有0个空指针,y个节点有1个空指针,z个节点有2个空指针
有如下等式
1、 x+y+z=N 节点总数为N,题目叙述
2、 y+2*z=N+1空指针个数为N+1,题目叙述
3、 2*x+y= N-1 二叉树的边数。树的边数=树的节点数-1
解以上方程组就可得出树的几种类型的节点数了。你就可以构造这个二叉树了。如果方程组有解
一般可以构造的二叉树是很多的。
⑨ 为什么用二叉链表存储树,则根节点的右指针是空 为什么不是指向右孩子
将一棵树转化为二叉树,此时二叉树的根节点的右指针为空,
因为这个指针是用来指向另一棵树的根节点的。具体情况你
也可以参看森林转化为二叉树的方法。
⑩ c++ 采用二叉链表作存储结构,实现二叉树非递归后序遍历算法
链接存储的二叉树类型和结构定义如下:
typedef
struct
bnode
{
ElemType
data;
struct
bnode
*lchild,
*rchild;
}
btree;
后序遍历
void
postorder(btree
*bt)
{
btree
*p=bt,
*stack[MAX];//p表示当前结点,栈stack[]用来存储结点
int
tag[MAX];
int
top=-1;
do
{
while(p
!=
NULL)//先处理结点的左孩子结点,把所有左孩子依次入栈
{
stack[++top]
=
p;
tag[top]
=
0;
p
=
p->lchild;
}
if(top
>=
0)
//所有左孩子处理完毕后
{
if(!tag[top])
//如果当前结点的右孩子还没被访问
{
p
=
stack[top];//输出栈顶结点
,但不退栈
,因为要先输出其孩子结点
p
=
p->rchild;
//处理其右孩子结点
tag[top]
=
1;
//表示栈中top位置存储的结点的右孩子被访问过了,下次轮到它退栈时可直接输出
}
else
//如果该结点的左右孩子都被访问过了
{
printf("%d",
stack[top--]->data);
//栈顶元素出栈,输出该结点,此时结点p指向NULL
}
}
}
while((p
!=
NULL)||(top
>=
0));
}