-
你把**貼出來看看。。。
-
您可以在中階遍歷之上新增一些指令。 n 表示層,初始值為 0,以下演算法是遞迴巢狀的。
1. n++,遍歷當前節點的左子樹。
2. n --,訪問當前節點,如果節點的資料 = = x,則(表示找到該節點)列印節點層數。
3. n++,遍歷當前節點的右子樹。
遞迴結束後,如果找不到 x 節點,別忘了,列印出來就找不到了。
-
<>紅色的是測試樹,內建在主函式中,具有後階遍歷功能。
#include
#include
using namespace std;
struct treenode
int val;
treenode *left;
treenode *right;
treenode(int x) :val(x), left(null), right(null) {//construction function
if (root == nullptr)
return;
fun(root->left, vt);
fun(root->right, vt);
for (auto ele : vt)
cout cout <;int main()
treenode *root = new treenode(0);
root->left = new treenode(1);
root->right = new treenode(2);
root->left->right = new treenode(3);
root->left->right->left = new treenode(4);
root->right->left = new treenode(5);
root->right->right = new treenode(6);
vectorvt;
fun(root, vt);
-
#include
using namespace std;
typedef struct tnode 二叉樹結構*bitree;
在中階遍歷模式下建立乙個二叉樹,並輸入指示節點為空,否則 t=null;
int countleaf(bitree t)}return leafnum;
用於測試的 main 函式 int main()。
-
設計乙個計算器,當當前節點的左右子節點不可用時,計算器會增加!
-
同學們,你們老師和我們老師留下的作業一模一樣,我有現成的程式,除錯成功。 這個程式的難點在於它非常笨拙,所以我為它設計了乙個結構來儲存輸入,然後將其轉換為線性結構。
#include
#include
struct inform *建立輸入資訊 struct inform*
struct leafnode *構建葉節點結構
void print(inform* ps, int n);
void judge ( inform* ps );
leafnode* creatree();宣告二叉樹構建函式
void preorder (leafnode* t);宣告預購遍歷函式
void inorder (leafnode* t);宣告按順序遍歷函式
void postorder (leafnode* t);宣告後序遍歷函式
char a[100];
int k=1;
int s=0;
inform *p;
void main()
a[0]= p->data;
judge ( p1 );*使用遞迴演算法將輸入資料資訊轉換為線性字串*
coutelse
if ((ps->signr) == 0)
elseleafnode* creatree() *構建二叉樹函式*
elsereturn t;
預購遍歷的遞迴函式
void preorder (leafnode* t)
用於中階遍歷的遞迴函式
void inorder (leafnode* t)
後階遍歷的遞迴函式
void postorder (leafnode* t)}
-
我不會寫標頭檔案或任何東西。
節點的定義。
typedef struct node
node, *tree;
1.該演算法旨在查詢二叉樹中的節點數。
void gettreenodecount( tree* t, int& count )
int gettreenodecount( tree t )// 2.設計演算法 printleapnode( tree t )}3.設計一種演算法來找到二叉樹的深度。
void gettreedeep( tree t, int i, int& deep )
elseint gettreedeep( tree t )
-
void postorder(void (*visit)(bintreenode*t))
雖然它只是乙個沒有上下文的片段,但當你把它拆開時,很容易理解。
首先,postorder() 函式不返回資料,其次,你去掉一對括號的 postorder 來檢視,那麼括號裡只包含乙個引數:void (*visit)(bintreenode*t),這是乙個函式定義,函式名是 visit,括號用星號括起來,表示這是乙個函式指標, 而且函式不返回乙個值,好吧,那我們分析的時候就不在乎它們返回什麼了,注意力集中在訪問的定義和引數上。
此時 visit 作為 postorder() 的引數,所以函式指標 visit 只在 postorder 中有意義,函式 deity 的名稱對 postorder 來說並不重要,postorder 在呼叫這個函式指標時可以滿足它的介面,函式的宣告為:void(*)bintreenode*),也就是說也只包含乙個引數: bintreenode 型別的指標,而 t 是表單引用的名稱。
繼續剝離,由於沒有看到定義,bintreenode 從型別的角度來看是乙個自定義泛型類,t 可以是任意基型別,可以輸入呼叫時間。
postorder(root, visit),類或當前命名空間中一定有兩個引數的過載函式,既然你沒有給**,我只能猜測它宣告如下:
根節點傳遞指標。
void postorder(bintreenode* proot , void (*visit)(bintreenode* t))
或者根節點直接傳遞實體。
void postorder(bintreenoderoot ,void (*visit)(bintreenode* t))
是傳輸根節點指標還是傳輸結構取決於設計要求,傳遞指標通常更方便。 root是根節點,visit是函式指標,也就是說,postorder的作用是把根節點和訪問函式的指標傳遞給他的兄弟完成任務。
因此,與其給自己打電話,不如注意引數的數量。
-
這裡的兩個後訂是不同的,在 C++ 中稱為過載。 前者只有乙個函式指標作為引數,後者有兩個引數。 顯然,後者應該有乙個定義,我猜你沒有仔細看,錯過了這部分**。
但無論哪種方式,它肯定使用遞迴,也就是稱呼自己。
後階遍歷的實現其實很簡單,先左後右,最後root。
-
我們很樂意為您解答!
有兩個引數,它們應該屬於同一型別。
在函式中呼叫自己稱為遞迴。
至於遞迴,你可以把它想象成一次執行乙個句子。 當您需要儲存狀態時,系統會自動使用堆疊為您儲存。 讓我們以你說的例子為例: >>>More
全二叉樹和完全二叉樹是二叉樹的兩種特殊形式。 完整的二叉樹意味著每個節點有兩個子節點,或者沒有子節點(即每個節點的度數為 2 或 0)。 完整的二叉樹是指除最後一層之外的所有節點都具有最大數量的節點,並且最後一層的節點盡可能集中在左側。 >>>More
在一棵完整的二叉樹中,任何節點的左右子樹的深度都是相等的,所以你只需要做乙個backroot遍歷就可以知道乙個二叉樹是否是乙個完整的二叉樹。 >>>More
具體方法是假設乙個節點計算的雜湊值、左子樹雜湊值和右子樹雜湊分別是 a、la 和 ra,然後我們去 hash2 看看 hash2[a] 是什麼,然後再使用 a。 >>>More