對於二叉樹的遍歷,先序的方式是比較簡單的,但是中序和後序的方式還是有點麻煩的,這裡先給出乙個用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...