思路就是如果當前任乙個孩子結點的值等於k,說明當前節點即為所需結點的雙親結點,通過遞迴實現唯一比較麻煩的是要寫很多條件,不然會報錯。
主要功能實現是preorder函式其他是構建和列印二叉樹的函式。
#include
#include
#include
using namespace std;
#define type char
//要求1.二叉樹中的結點個數2.葉子結點個數3.某結點層次4.二叉樹的寬度
struct treenode};
class tree
k = p - in;
b->left =
createfromarray
(pre+
1,in,k)
; b->right =
createfromarray
(pre+k+
1,p+
1,n-k-1)
;return b;
}void
print
(treenode *tr)
if(tmp->right!=
null)}
printf
("\n");
}}void
preorder
(treenode *bt, type x)
else
if(bt->right !=
null
&& bt->right->val == x)
else
if(bt->right !=
null)}
}}};
intmain()
;//前序
type b=
;//中序
int n =8;
int choose =0;
treenode *new_bt;
//建立結點
tree bt1;
//建立類
new_bt = bt1.
createfromarray
(a,b,n)
; bt1.
print
(new_bt)
; bt1.
preorder
(new_bt,
'g')
;return0;
}
二叉樹如圖所示:
執行結果:
求二叉樹某個結點的祖先
考試做到這一題,當時寫的很亂,這讓我很煩,題目就是在二叉樹查詢某個值的結點,如果找到則輸出該節點的所有祖先,那我當時想到的就是用後序遍歷的非遞迴演算法,如果找到的話,棧中的所有元素就是該節點的祖先,不過後序遍歷的話需要用乙個標記記錄棧頂元素,第一次訪問棧頂的元素的時候不出棧,第二次訪問棧頂元素的時候...
求二叉樹中結點的最大距離
距離 是兩結點之間邊的個數。求最大距離存在兩種情況,一是路徑經過左子樹的最深結點,通過根結點,再到右子樹的最深結點。二是不穿過根結點,二是左子樹或右子樹的最大距離路徑中,取其大者。問題的核心在於兩種不同的情況需要不同的資訊,一是需要子樹的最大深度,二是需要子樹的最大距離。遞迴 如下 先序遍歷輸入用例...
二叉樹結點, 排序
二叉樹結點,排序 1.二叉搜尋樹結點最小距離 給定乙個二叉搜尋樹的根結點 root,返回樹中任意兩節點的差的最小值 對這個序列相鄰相減,取最小值即可。實現時,可以優化掉這個序列。在遍歷時記錄上乙個訪問的節點值,和當前節點相減,記錄下最小值即可 定義樹節點 public class treenode ...