二叉樹的七種遍歷 三種遞迴,三種非遞迴

2021-09-26 08:52:01 字數 2299 閱讀 3370

二叉樹的標頭檔案…不包含裡面所用的棧和佇列的標頭檔案

在非遞迴裡面會用到,非遞迴只闡述思想,不寫**,遞迴**如下:

#ifndef _btree_h_

#define _btree_h_

typedef char btdatatype;

typedef struct binarytreenode

btnode;

// 通過前序遍歷的陣列"abd##e#h##cf##g##"構建二叉樹

btnode* binarytreecreate(btdatatype* a);//建立二叉樹

void binarytreedestory(btnode** root);

int binarytreesize(btnode* root);//元素的個數

int binarytreeleafsize(btnode* root);//葉子數

int binarytreelevelksize(btnode* root, int k);//第幾層有幾個元素 遞迴的寫法

btnode* binarytreefind(btnode* root, btdatatype x);

// 遍歷

void binarytreeprevorder(btnode* root);

void binarytreeinorder(btnode* root);

void binarytreepostorder(btnode* root);

// 非遞迴遍歷

// 層序遍歷

void binarytreelevelorder(btnode* root);

// 判斷二叉樹是否是完全二叉樹

int binarytreecomplete(btnode* root);

void binarytreeprevordernonr(btnode* root);

void binarytreeinordernonr(btnode* root);

void binarytreepostordernonr(btnode* root);

void testbinarytree();

#endif//_btree_h_

1.前序遞迴演算法

tnode* binarytreecreate(btdatatype* src)//二叉樹的建立

btnode *cur = (btnode *)malloc(sizeof(btnode));

cur->_data = src[s_n];

s_n++;

cur->lchild = binarytreecreate(src);

cur->rchild = binarytreecreate(src);

return cur;

}void binarytreeprevorder(btnode* root)//二叉樹的前序遍歷

}

2.中序遞迴演算法

void binarytreeinorder(btnode* root)//二叉樹的中序遍歷

}

3.後序遞迴演算法

void binarytreepostorder(btnode* root)//二叉樹的後序遍歷

}

4.層序遞迴演算法

void binarytreelevelorder(btnode* root)//層序遍歷

5.前序非遞迴遍歷演算法

void binarytreeprevordernonr(btnode* root)//前序非遞迴遍歷

6.中序非遞迴演算法

void binarytreeinordernonr(btnode* root)//中序非遞迴遍歷

7.後序非遞迴演算法

void binarytreepostordernonr(btnode* root)//後序非遞迴遍歷

while(!stackisempty(&st) && tag[st.size-1])迴圈列印出棧

前面的條件只在迴圈結束的時候生效

後面的條件分兩種情況

1.當此次cur為空時,for不進,此條件成立,

2.當cur不為空,for進,此條件不成立

if(!stackisempty(&st))此條件只在最後一次迴圈跳出的時候生效

}while(!stackisempty(&st));

*/}

二叉樹的三種非遞迴遍歷

一.前序遍歷 前序遍歷按照 根結點 左孩子 右孩子 的順序進行訪問。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 ...