二叉樹的建立,以及非遞迴遍歷

2022-09-13 02:15:13 字數 2275 閱讀 3786

關於二叉樹的建立,根據前序和中序,建立二叉樹。並且總結關於二叉樹前序,中序以及後序的非遞迴遍歷。

1、二叉樹的建立

利用遞迴的思想建立二叉樹,如pre=; mid=分別代表前序和中序的遍歷結果。前序結果中的第乙個元素為8,為根節點,中序遍歷中mid[0]~mid[5]是8的左子樹,左子樹的根節點為11,mid[7]~mid[9]為右子樹,其根節點為12。建立以8為根的二叉樹,就可以轉換為建立以11為根的節點8的左子樹,和以12為根的節點8的右子樹。通過遞迴呼叫,構建二叉樹。

2、二叉樹的非遞迴前序遍歷

前序遍歷優先訪問根節點,在訪問左子樹的根節點,在右子樹的根節點。訪問順序為根->左孩子->右孩子。利用棧來儲存節點,每遇到乙個節點,則提取資料。

設定根節點為當前節點cur,不為空入棧;

左孩子是否為空,不為空則持續入棧,提取資料,更新當前節點為root。為空則出棧,更新出棧元素的右孩子為當前節點;

結束條件,棧為空。

3、二叉樹的非遞迴中序遍歷

中序遍歷的順序為,左孩子->根節點->右孩子。

設定根節點為當前節點cur,不為空入棧;

左孩子是否為空,不為空,入棧,並更新左孩子為當前節點,入棧直至為空;

當前節點為空,出棧;提取資料,更新右孩子為當前節點。

結束條件,棧為空。

4、二叉樹的非遞迴後序遍歷

後序遍歷的順序為,左孩子->右孩子->根節點。需要設定乙個最近的遍歷節點,以判斷右孩子是否已遍歷。

設定根節點為當前節點cur,不為空則入棧;

左孩子是否為空,不為空,則入棧,並更新左孩子為當前節點,入棧直至為空;

當前節點為空,提取頭結點為當前節點;判斷右孩子為空,或者右孩子已訪問,則提取資料,出棧,更新previsited;

若右孩子不為空,且未訪問,則設定右孩子為當前節點;

結束條件,棧為空。

#include#include

using

namespace

std;

struct

node

~node(){}

};node* _build_tree(int pre,int start_pre,int mid,int start_mid, int

len)

}int left_len = index-start_mid;//

左子樹的長度

if(left_len>0)root->left = _build_tree(pre,start_pre+1

,mid,start_mid,left_len);

int right_len = start_mid+len-index-1;//

右子樹的長度

if(right_len>0)root->right = _build_tree(pre,start_pre+left_len+1,mid,index+1

,right_len);

return

root;}//

create bitree according to the pre_order, and mid_order;

node* build_tree(int pre,int mid,int

len)

//non-recursive pre-order

void pre_order_non(node*root)

cur =st.top();

st.pop();

cur = cur->right;

}}//non-recursive mid-order

void mid_order_non(node*root)

cur =st.top();

cout

st.pop();

cur = cur->right;

}}//

non-recursive post-order

void post_order_non(node*root)

cur =st.top();

if(cur->right==null||cur->right==previsited)

else

cur=cur->right;

}}int

main();

int mid=;

node* root =build_tree(pre,mid,length);

mid_order_non(root);

post_order_non(root);

pre_order_non(root);

system(

"pause");

}

二叉樹的建立 非遞迴遍歷

struct binarytree binarytree createbinarytree 先序建樹 若碰到 就是表示為空,如果不是空,就先建左子樹,後建立右子樹 else return p 借助棧。判斷當前節點是否為空,否,把當前節點壓入棧,訪問該節點,並左路下降pnode指向pnode left...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...