利用二叉鏈表存儲樹
① 二叉鏈表存儲樹,根結點的右指針是空嗎怎麼不是指向最右孩子
以二叉鏈表作樹的存儲結構,即用孩子兄弟表示法來表示樹,鏈表中結點的兩個鏈域分別指向該結點的第一個孩子結點和下一個兄弟結點,根結點沒有兄弟結點,所以右指針是空的
② 利用二叉鏈表存儲樹,則根節點的右指針是空的,這是為什麼呢,謝謝
二叉鏈表存儲樹結構,那麼任意節點的左孩子指向該結點的孩子結點,右孩子指針指向該節點的兄弟節點,因為這里是樹,不是森林,所以樹的根節點沒有兄弟結點,則右指針是空。
③ 用二叉鏈表存儲樹,為什麼根結點的右指針是空,數據結構
採用二叉樹結構存儲樹或森林,即樹/森林的左子右兄表示法。
二叉樹中節點的左「孩子」是原樹/森林對應節點的「長子節點」,右「孩子」是原樹/森林對應節點的「兄弟節點」。
而樹的根節點是沒有兄弟的,故在二叉鏈表中它的右指針為空()
④ 利用二叉鏈表存儲二叉樹,則根節點的右指針為空。 為什麼不是指向右孩子
題目寫錯了吧,應該是用二叉鏈表存儲樹(轉換的二叉樹),則根結點的右指針為空
⑤ 採用二叉鏈表作為存儲結構,完成二叉樹的建立,前序、中序和後序遍歷的操作,求所有葉子及結點總數的操作
#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));
}