二叉樹根結點到任意結點的路徑

2021-04-14 00:38:43 字數 1960 閱讀 2642

準備明年上半年的軟體水平考試,學習資料結構中。將課後一些有代表性的習題,新增註解,整理後貼出來,可讓自己的思路變得更清晰,更條理,也可與別的學習者們交流

問題描述:

設二叉樹以二叉鏈結構儲存,b為指向根結點指標,x為任一結點型別資料,在樹b中尋找x,並列印顯示出經過的路徑

演算法思路:

1,定義樹結點型別,設計建立樹函式createbtnode()(用乙個符號表示法的字串建立),將這兩部份定義為標頭檔案btree.h。

2,設計求樹的路徑函式path()。

(1)定義乙個棧,儲存查詢時經過的結點指標,並增加乙個標誌位flag避免回溯時訪問已訪問過的結點。

(2)類似於先序遍歷,先訪問根結點,然後訪問左子樹,接著是右子樹,直至找到該結點。

(3)如果找到該結點,則列印棧中的資料(從棧底至棧頂)。如果找不到,則顯示相關資訊。

演算法實現:

//btree.h:

#include

#include

#include

#define maxsize 128*128

struct btnode   //定義樹結點型別

;void createbtnode(btnode *&b,char ch)   //用括號表示法的子符串建立樹}}

i++;}}

//function path():

#include "btree.h"

void path(btnode *b,char x)

st[maxsize];                     

int top=-1;

p=b;

if(b->data==x)   //如果根結點資料等於x

printf("%c/n",b->data);

else   //如果不是根結點

if(p!=null)   //如果找到,則列印棧中內容(從棧底至棧頂)

else if(p==null&&st[top].bt->rchild!=null&&st[top].flag==0)   //如果在左子樹中未找到,且其右子樹不空

else   //如果是葉子結點

else   //如果回溯後的結點右子樹已訪問

top--;   //再回溯一次,直至找到右子樹還沒訪問的結點

}}while(top!=-1);   //查詢直至棧空

if(top<=-1)

printf("can't find the tree node!/n");   //棧空且未找到該結點,列印提示資訊 }}

//main():

int main()

輸入:o

輸出:a->c->g->o

另乙個方法    利用層次遍歷的思想

#include

#include

#define maxsize 100

struct btnode

;struct queue

q[maxsize];

int front=-1,rear=-1;

void ppath();

void levelorder(btnode *b,int k)

if(p.node->lchild!=null)

if(p.node->rchild!=null)}}

void ppath()

while(j>=0);

k=0;

while(k",q[k].node->data);

k++;

}printf("%d/n",q[front].node->data);

}btnode *sqtolink(int a,int i,int n)

else return null;

}int main()

;btnode *b=sqtolink(a,1,11);

levelorder(b,8);

return 0;

}輸出:1->2->4->8

求二叉樹中從根結點到葉子結點的路徑

實驗題目 求二叉樹中從根結點到葉子結點的路徑 實驗目的 掌握二叉樹遍歷演算法的應用,熟練使用先序 中序 後序3種遞迴 和非遞迴遍歷演算法以及層次遍歷演算法進行二叉樹問題求解。實驗內容 設計程式,完成如下功能 1 採用先序遍歷方法輸出所有從葉子結點到根結點的逆路徑 2 採用先序遍歷方法輸出第一條最長的...

尋找二叉樹上從根結點到給定結點的路徑

1.遞迴實現 public static boolean searchnode treenode root,stacks,treenode node 2.非遞迴實現 思想 這個稍微有些複雜,當然也是要借助棧來完成。其實這裡和二叉樹的非遞迴先序遍歷的思想差不多,只是在這個基礎上進行一些改造。首先,新建...

輸出二叉樹中所有從根結點到葉子結點的路徑

輸出二叉樹中所有從根結點到葉子結點的路徑.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std struct btnode 先序建立二叉樹 void creatbtree btnode root else 輸出二...