準備明年上半年的軟體水平考試,學習資料結構中。將課後一些有代表性的習題,新增註解,整理後貼出來,可讓自己的思路變得更清晰,更條理,也可與別的學習者們交流
問題描述:
設二叉樹以二叉鏈結構儲存,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 輸出二...