天天看點

二叉樹的建立與先序,後序,中序輸出

如果二叉樹為:

                              a

             b                                 c

                     d                                 e

由于程式中要知道葉子結點(終點)。是以要講上面的二叉樹變成擴充二叉樹(把葉子結點的孩子補成#,用作标記),擴充後就變成了:

                                    a

                    b                                 c

          #                  d              #                e

                       #             #                   #          #

那麼在輸入的時候,須要輸入ab#d##c#e##(輸入後直接回車就可以)

#include <stdio.h>

#include<stdlib.h>

#define ElemType char

//節點聲明,資料域、左孩子指針、右孩子指針

typedef struct BiTNode{

char data;

struct BiTNode *lchild, *rchild;

}BiTNode, *BiTree;

BiTree createBiTree()

BiTree T;

char ch;

scanf("%c", &ch);

if (ch == '#')

T = NULL;

else

{

T = (BiTree)malloc(sizeof(BiTNode));

T->data = ch;

T->lchild = createBiTree();

T->rchild = createBiTree();

}

return T;

以下就是二叉樹的周遊。周遊是通過遞歸進行周遊

//先序周遊

void PreorderTraverse(BiTree T)

if (T)

printf("%c\n", T->data);

PreorderTraverse(T->lchild);

PreorderTraverse(T->rchild);

//中序周遊

void InorderTraverse(BiTree T)

//後序周遊

void PostorderTraverse(BiTree T)

二叉樹高度的求法傳回T所指向的二叉樹的高度

處理方法:1.若T為空則傳回0否則

                2.求出左右子樹的高度L1和L2。并傳回兩者之中最大的。

                3.由于沒有算根節點僅僅是求的左右子樹。是以須要加1。

int dep(BiTree T)

int max;

if (T == NULL)

return 0;

max = dep(T->lchild);

if (dep(T->rchild) > max)

max = dep(T->rchild);

return max + 1;

int main(void)

int ch;

printf("請利用先序插入法插入您要建立的二叉樹!\n");

T = createBiTree();

while (1)

printf("按下列選項選擇您要進行的操作\n");

printf("1前序輸出.\n");

printf("2.後序輸出\n");

printf("3.中序輸出\n");

printf("4.退出\n");

scanf("%d", &ch);

switch (ch)

case 1:

PreorderTraverse(T); break;

case 2:

PostorderTraverse(T); break;

case 3:

InorderTraverse(T); break;

case 4:

default:

break;

二叉樹的建立與先序,後序,中序輸出

以下是我做的一點點改進,利用c++中的指針引用将問題進行了簡單的改動。以下是基本的兩個函數。就是BST樹的建構函數以及主函數

建構函數

二叉樹的建立與先序,後序,中序輸出

這樣的方法不須要傳回值了,是直接對指針進行操作。

主函數的寫法

二叉樹的建立與先序,後序,中序輸出