程式小白,希望和大家多交流,共同學習
//非遞迴二叉樹借用棧
//使用鏈棧,
//使用它的原因:1.需要使用先進後出的儲存結構;2.需要儲存資料個數不定;
//三種遍歷儲存的雖然都是相同的資料型別,但是使用的目的不一樣,所以使用的位置不一樣
//先序遍歷:根據給定的根節點,直接訪問根節點(左結點,有左孩子的結點有兩重身份),
// 儲存的結點是為了可以很容易的找到右子樹的根節點。如此反覆。
//中序遍歷:根據給定的根節點,在搜尋最左結點時,儲存所有的根節點。
// 然後使用棧訪問根節點,再使用根節點,搜尋右子樹的根節點。如此反覆。
//後續遍歷:使用根節點配合棧找到第乙個沒有左右孩子的結點。棧儲存的是每乙個結點。
// 為的是,當使用根節點找到第乙個沒有左孩子的結點後,使用棧找到第一
// 沒有右孩子的結點。找到的是第乙個既沒有左孩子,也沒有右孩子的結點。如此反覆。
#include
using
namespace
std;
//定義二叉樹結點
typedef
char elembtree;
struct btnode
;typedef btnode *btree;
//定義儲存二叉樹結點的棧
//typedef char elemstack;
typedef btnode *elemstack;
struct snode
;typedef snode *linklist;
//初始化棧
void initstack(linklist &ls);
//入棧
void push(linklist &ls, elemstack data);
//出棧
void pop(linklist &ls);
//返回棧頂元素
elemstack gettop(linklist ls);
//判空
bool isempty(linklist ls);
//判滿
bool isfull(linklist ls);
//先序建立二叉樹
void precreatebt(btree &bt);
//先序遍歷二叉樹
void preorder(const btree &bt);
//中序遍歷二叉樹
void inorder(const btree &bt);
//後續遍歷二叉樹
void postorder(const btree &bt);
//訪問結點
void visit(btnode *node);
int main()
//初始化棧
void initstack(linklist &ls)
//入棧
void push(linklist &ls, elemstack data)
else
cout
<< "棧已滿,無法入棧";
}//出棧
void pop(linklist &ls)
else
cout
<< "棧空,無法出棧";
}//返回棧頂元素
elemstack gettop(linklist ls)
//判空
bool isempty(linklist ls)
else
return
false;
}//判滿
bool isfull(linklist ls)
else
}//先序建立二叉樹
//對於每個結點,左右孩子為空輸入#
void precreatebt(btree &bt)
else
}//先序遍歷二叉樹
//void preorder(const btree &bt)
node = node -> lchild;
}if (!isempty(ls))
}}//中序遍歷二叉樹
void inorder(const btree &bt)
if (!isempty(ls))
}}//後續遍歷二叉樹
//需要親自模擬才能明白其中pre和node==0的作用
void postorder(const btree &bt)
if (!isempty(ls))//找第乙個沒有右孩子的結點(r)
else
node = node -> rchild;//當有右孩子的時候,向右轉}}
}//訪問結點
void visit(btnode *node)
二叉樹 遞迴 非遞迴
include include include include using namespace std typedef struct node bintree typedef struct node1 btnode void creatbintree char s,bintree root 建立二叉...
非遞迴二叉樹
由於棧和遞迴原理相同,且遞迴建立二叉樹的效率較低,所以我們可以借助棧來實現二叉樹的非遞迴建立以及遍歷。include include using namespace std template struct binarytreenode template class binarytree binary...
二叉樹遍歷 非遞迴演算法
文庫文章 二叉樹前序遍歷 根 左結點 右結點 所以在訪問到乙個節點不為空時 先訪問此結點,然後把此結點的非空右孩子先入棧,然後再把非空左孩子入棧。具體 如下 二叉樹後序非遞迴演算法 第二種思路 要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,...