二叉樹中序遍歷方法實現

2022-04-10 12:59:29 字數 1434 閱讀 2870

對於二叉樹的遍歷,先序的方式是比較簡單的,但是中序和後序的方式還是有點麻煩的,這裡先給出乙個用c++stack的遍歷方式:

1.如果當前結點不為空

把當前結點壓入棧

p=p->left轉向其左孩子

2.如果當前結點為空(證明這半棵子樹已經遍歷完成,需要從棧頂找到樹根)

取棧頂元素為當前結點,棧做一次彈棧操作

訪問當前結點

p=p->right轉向其右孩子

3.重複1、2操作,直到棧為空並且當前結點為null,結束。

演算法**實現:

vectorinorder(treenode *root)

//if

else

}//while

return result;

}

這種利用棧的遍歷方法很簡單,在之前我也設計了乙個自己的遍歷的方法:

1.如果當前結點為空(null)

取棧頂元素為當前結點,棧做一次彈棧操作

訪問當前結點

p=p->right轉向其右孩子

2.如果當前結點不為空

如果當前結點有左孩子

把當前結點壓入棧

p=p->left轉向其左孩子

如果當前結點沒有左孩子

訪問當前結點

p=p->right轉向其右孩子

3.重複1、2操作,直到棧為空並且當前結點為null,結束。

**實現:

vectorinorder(treenode *root)

//if

else

else

}//else

}//while

return result;

}

上面介紹了兩種利用棧對樹中序遍歷的方法,下面還是說一下morris的遍歷方法

1.如果當前結點有左子樹

找到左子樹的最右葉子結點

如果最右葉子結點的右指標域為空(null)

使最右葉子結點的右指標域指向當前結點

p=p->left轉向其左子樹

如果最右葉子結點的右指標域已經指向了當前結點

訪問當前結點

斷開morris鏈結

p=p->right轉向其子樹

2.如果當前結點沒有左子樹

訪問當前結點

p=p->right轉向其子樹

3.重複1、2操作,直到當前結點為null,結束。

演算法**實現:

vectorinorder(treenode *root)

if(temp->right == null)

else //temp->right == cur

}else //沒有左子樹

}//while

return result;

}

二叉樹中序遍歷

訪問根結點的的左子樹,訪問根結點和訪問根結點的右子樹依次記作 l,d r 中序遍歷 ldr 演算法 遍歷根結點的左子樹,訪問根結點 遍歷根結點的右子樹 對於上面的圖,我們假定只有a,b,c三個結點,則中序遍歷結果為 b a c 採用上節 二叉樹鏈式儲存和前序遍歷 中的遞迴推演 db a c d b ...

二叉樹中序遍歷

二叉樹中序遍歷 非遞迴版本的中序遍歷用棧來實現。乙個元素出現在棧頂一次,這一次會被處理並出棧。trick 用乙個指標去記錄當前節點cur,如果cur left左側還未遍歷,就會將cur入棧並訪問cur left。一行很重要的 是cur cur right,這一句之後如果cur null,則說明棧頂元...

二叉樹 php實現先序 中序 後序遍歷二叉樹

二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用於實現二叉查詢樹和二叉堆 php view plain copy classnode 先序遍歷 根節點 左子樹 右子樹 functionpreorder ro...