尋找二叉樹中每個結點的根結點(遞迴演算法)

2021-08-15 23:08:06 字數 1574 閱讀 2411

筆者查閱了網上關於二叉樹尋找根結點的演算法,眾說紛紜,有:在節點結構體中加一條指向父節點的指標;非遞迴遍歷樹的方式尋找父節點;直接利用樹的遞迴遍歷,列印輸出父節點……

筆者認為新增父節點指標的方法,不能很好地體現樹的邏輯結構。樹的結構體(特指二叉樹的儲存結構)已經很成熟而且近乎約定俗成了,再重新新增乙個指標,很多關於二叉樹的基本操作都要重新變化,實在繁瑣。所以本文直接利用樹的遞迴遍歷方式尋找樹的根結點,因為樹的定義中本就體現了遞迴的特點,所以大多數關於樹的操作,遞迴的方法都可有效實現,而且**可讀性強。此外,對於非遞迴方式的解法,本文不再贅述,請讀者自便。

*另:本文只提供一種思路,並不是萬能模板,具體問題還需結合實際情況決定!

【問題描述】構造一棵二叉排序樹(也叫二叉查詢樹),可以是一棵空樹。

二叉排序樹定義:

1.若左子樹非空,則左子樹上所有關鍵字值均不大於根結點的關鍵字值;

2.若右子樹非空,則右子樹上所有關鍵字值均不小於根結點的關鍵字值;

3.左、右子樹本身也是一棵二叉排序樹。

現在給你n個關鍵字值各不相同的結點,要求你按順序插入乙個初始為空樹的二叉排序樹中,每次插入成功後,求相應的父節點的關鍵字值。如果沒有父親節點,則輸出-1。

input:

第一行,乙個數字n(n<=100),表示待插入的結點數。

第二行,n個互不相同的正整數,表示要順序插入結點的關鍵字值,這些值不超過10^8(即控制在int型資料型別所能表示的範圍內)。

output:

輸出共n行,每次插入節點後,該節點對應的父親節點的關鍵字值。(根結點的父節點預設為-1)

**中採用陣列二叉樹的方式儲存樹,有兩點好處:loc值可知結點總數,利於結點遍歷步數的控制;輸入值儲存在對應陣列,易操作。

指標二叉樹的儲存方法,還望讀者指教。

#include 

struct

nodetree[101]; // 陣列二叉樹

int loc; // loc表示當前節點的個數

node* creat()

/*在一棵二叉樹中,依次插入結點,構造二叉排序樹*/

node* insert(node *t,int x)

else

if(x < t->data)

else

if(x > t->data)

return t;

}/*遍歷一棵樹找到各結點的父節點--先序遍歷模型,注意遍歷孩子節點的條件:孩子非空*/

void findparent(node *t,int x)

int main()

/*對根結點的父節點的判斷有點投機取巧,應在函式中判斷所訪問結點是否為樹的根結點,是則列印-1*/

printf("%d的父結點是:-1\n",tree[0].data); // 寫者這裡直接跳過判斷,因為二叉排序樹的首節點必為根結點

for(int i=1;it,tree[i].data); }}

return 0;

}

執行結果:

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

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

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

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

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

準備明年上半年的軟體水平考試,學習資料結構中。將課後一些有代表性的習題,新增註解,整理後貼出來,可讓自己的思路變得更清晰,更條理,也可與別的學習者們交流 問題描述 設二叉樹以二叉鏈結構儲存,b為指向根結點指標,x為任一結點型別資料,在樹b中尋找x,並列印顯示出經過的路徑 演算法思路 1,定義樹結點型...