今天覆習了一下二叉樹的前序遍歷、中序遍歷、後序遍歷的遞迴與非遞迴演算法,順便記錄一下:
//測試用例: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 ...