二叉樹的三種遍歷的遞迴與非遞迴演算法

2022-09-07 01:06:13 字數 1733 閱讀 5945

今天覆習了一下二叉樹的前序遍歷、中序遍歷、後序遍歷的遞迴與非遞迴演算法,順便記錄一下:

//

treetest.h

#include struct

treenode

};class

mytree;//

treetest.cpp

#include "

treetest.h

"#include

#include

#include

using

namespace

std;

mytree::mytree() : m_root(null)

mytree::~mytree()

void mytree::destroy(treenode*root)

treenode* mytree::create(treenode*&root)

treenode* mytree::gettreenode(int

value)

void

mytree::createtreeforpreorder()

void mytree::preorderrecursive(treenode*root)

void mytree::inorderrecursive(treenode*root)

void mytree::postorderrecursive(treenode*root)

void mytree::levelorderrecursive(treenode*root)

}void

mytree::preorderrecursive()

void

mytree::inorderrecursive()

void

mytree::postorderrecursive()

void

mytree::levelorderrecursive()

void

mytree::preorderunrecursive()

printf("\n

");}void

mytree::inorderunrecursive()

p =s.top();

s.pop();

p->print();

/*由於是中序遍歷,那麼訪問了當前節點後,

下一步必定要訪問該節點的右子樹

*/p = p->rightchild;

}printf("\n

");}void

mytree::postorderunrecursive()

p =s.top();

/*判斷表示當前節點的右節點沒有或已經訪問過

q表示上一次訪問的節點,由於是後續遍歷,

若當前節點有右節點,那麼上一次訪問的節點一定是當前節點的右節點

*/if (!p->rightchild || p->rightchild ==q)

else

}printf("\n

");}//

main.cpp

#include "

treetest.h

"int

main()

測試用例:

二叉樹的三種非遞迴遍歷

一.前序遍歷 前序遍歷按照 根結點 左孩子 右孩子 的順序進行訪問。1.遞迴實現 void preorder1 bintree root 遞迴前序遍歷 2.非遞迴實現 根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後...

二叉樹的三種非遞迴遍歷

遞迴演算法和非遞迴演算法的轉換 可以借助棧,將二叉樹的遞迴演算法轉換為非遞迴演算法,下面以中序遍歷為例給出中序遍歷的非遞迴演算法。先掃瞄 並非訪問 根結點的所有左結點並將他們一一進棧。然後出戰乙個結點 p 顯然結點 p沒有左孩子結點或者左孩子結點均已訪問過 則訪問它。然後掃瞄該結點的有孩子結點,將其...

二叉樹的三種非遞迴遍歷

struct treenode 一 前序輸出二叉樹 void preorder treenode root p stk.top stk.pop p p right 二 中序輸出二叉樹 void midorder treenode root p stk.top cout void postorder ...