二叉樹非遞迴演算法

2021-08-19 17:01:36 字數 2398 閱讀 9162

程式小白,希望和大家多交流,共同學習

//非遞迴二叉樹借用棧

//使用鏈棧,

//使用它的原因: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不存在左孩子和右孩子,...