二叉樹的各類操作

2021-07-16 20:35:17 字數 1317 閱讀 8214

#include#include#include#includetypedef char elemtype;  

//樹結構

typedef struct tree

treenode,*tree;

//建立一棵樹,#號結束 先序遍歷建立

void createtree(tree &t)else

}//遞迴先序遍歷

void preorder(tree t)

//非遞迴先序遍歷

/*void preorder1(tree t)

if(!s.empty())

}}*/

//遞迴中序遍歷

void inorder(tree t)

//非遞迴中序遍歷

/*void inorder(tree t)

if(!s.empty())

}} */

//遞迴後序遍歷

void postorder(tree t)

//第一種思路:對於任一結點p,將其入棧,然後沿其左子樹一直往下搜尋,直到搜尋到沒有左孩子的結點,

//此時該結點出現在棧頂,但是此時不能將其出棧並訪問,因此其右孩子還為被訪問。所以接下來按照相同的規則對其右子樹進行相同的處理,當訪問完其右孩子時,該結點又出現在棧頂,此時可以將其出棧並訪問。這樣就保證了正確的訪問順序。可以看出,在這個過程中,每個結點都兩次出現在棧頂,只有在第二次出現在棧頂時,才能訪問它。因此需要多設定乙個變數標識該結點是否是第一次出現在棧頂。

//第二種思路:要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,則可以直接訪問它;或者p 存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結點。若非上述兩種情況,則將p的右孩子和左孩子依次入棧,這樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被訪問,左孩子和右孩子都在根結點前面被訪問。

//非遞迴後序遍歷

/*void postorder1(tree t)else

}} */

//遞迴求樹的深度

int depthtree(tree t)

//遞迴求樹的子節點個數

int childsum(tree t)

return childsum(t->lchild)+childsum(t->rchild);

}//遞迴交換左右子女

void exchangetree(tree t)

}//遞迴層次列印二叉樹

void floorprint(tree t)

int main()

二叉樹各類操作

1.二叉樹鏈式儲存 1.typedef char datatype 2.3.typedef struct binnodebinnode 8.9.typedef binnode bintree bintree本身是個指向結點的指標 2.前序遍歷 根節點 左子樹 右子樹 1.void preorder ...

二叉樹的各類操作

include include 定義結構 typedef struct node bitnode,bitree 建立二叉樹 void createbitree bitree bt else 先序遍歷二叉樹 void preorder bitree root 中序遍歷二叉樹 void inorder ...

二叉樹的各類遍歷

include include include include define maxn 1111 using namespace std struct bintree bintree build bintree t void preorder bintree t 前序遍歷遞迴 void inorde...