1. 程式人生 > >二叉樹儲存-鏈式

二叉樹儲存-鏈式

#include <iostream>

using namespace std;

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

#define MAXSIZE 100

typedef int Status;

typedef char TElemType;

TElemType Nil = ' ';    //  字元型以空格為空

typedef struct BiNode{

    TElemType data ;

    struct BiNode * leftchild, *rightchild;

}BiNode, *BiTree;

// 提供樹結點相關
int indexChar = 1
; typedef char MyString[24]; // 0 位置存放串的長度 MyString str; Status setStringAssign(MyString T, const char *chars){ int i; if(strlen(chars) > MAXSIZE) return ERROR; else{ T[0] = strlen(chars); for (i = 1; i<=T[0]; i++) T[i] = *(chars + i - 1); return
OK; } } // 構造空二叉樹T Status initBiTree(BiTree *T){ // 二級指標的使用 *T = NULL; return OK; } #define DestoryBiTree ClearBiTree // 若二叉樹存在 銷燬二叉樹T void DestoryBiTree(BiTree * T){ if(*T){ if((*T)->leftchild) DestoryBiTree(&(*T)->leftchild); if((*T)->rightchild) DestoryBiTree(&(*T
)->rightchild); free(*T); *T = NULL; } } // 按照前序輸入二叉樹中節點的值(一個字元) // #表示空樹,構造二叉連結串列表示二叉樹T。 void CreateBiTree(BiTree *T){ TElemType ch; ch = str[indexChar++]; if(ch == '#') (*T) = NULL; else{ *T = (BiTree)malloc(sizeof(BiNode)); if (!(*T)) exit(0); (*T)->data = ch; CreateBiTree(&(*T)->leftchild); CreateBiTree(&(*T)->rightchild); } } Status BiTreeEmpty(BiTree T){ if(T) return FALSE; else return TRUE; } Status BiTreeDepth(BiTree T){ if(T == NULL) return 0; int leftDepth, rightDepth; if(T->leftchild) leftDepth = 1 + BiTreeDepth(T->leftchild); else leftDepth = 0; if(T->rightchild) rightDepth = 1 + BiTreeDepth(T->rightchild); else rightDepth = 0; return rightDepth > leftDepth ? rightDepth : leftDepth; } TElemType Root(BiTree T){ if(BiTreeEmpty(T)) return Nil; else return T->data; } TElemType Value(BiTree p){ if(p != NULL) return p->data; return Nil; } // 給指標 p 指向的節點賦值 void Assign(BiTree p, TElemType value){ if(p != NULL) p->data = value; } void PreOrderTraverse(BiTree T){ if(BiTreeEmpty(T)) return; cout<<T->data<<" "; PreOrderTraverse(T->leftchild); PreOrderTraverse(T->rightchild); } void PostOrderTraverse(BiTree T){ if(BiTreeEmpty(T)) return; PostOrderTraverse(T->leftchild); PostOrderTraverse(T->rightchild); cout<<T->data<<" "; } void InOrderTraverse(BiTree T){ if(BiTreeEmpty(T)) return; InOrderTraverse(T->leftchild); cout<<T->data<<" "; InOrderTraverse(T->rightchild); } int main(int argc, const char * argv[]) { BiTree T; TElemType e1; initBiTree(&T); setStringAssign(str,"ABDH#K###E##CFI###G#J##"); CreateBiTree(&T); cout<<"構造空二叉樹後,樹空否?(1:是 0:否)"<<BiTreeEmpty(T)<<" 樹的深度=\n"<<BiTreeDepth(T)<<endl; e1 = Root(T); cout<<"二叉樹的根為: "<<e1<<endl; cout<<"\n前序遍歷二叉樹:"; PreOrderTraverse(T); cout<<"\n中序遍歷二叉樹:"; InOrderTraverse(T); cout<<"\n後序遍歷二叉樹:"; PostOrderTraverse(T); ClearBiTree(&T); cout<<"\n清空二叉樹後,樹空否?(1:是 0:否)"<<BiTreeEmpty(T)<<" 樹的深度=\n"<<BiTreeDepth(T)<<endl; return 0; }