二叉树基本操作代码
#include "stdafx.h" #include "stdlib.h" #include "string.h" #define MAX 100 typedef char Elemtype; typedef struct BTNODE { Elemtype data; BTNODE *left; BTNODE *right; } BTNode; void CreateBTNode(BTNode *&root, char *str) { BTNode *p = NULL; BTNode *st[MAX] = {NULL}; int top = -1; int i = 0; int k = 0; char ch = str[i]; while ('\0' != ch) { switch (ch) { case '(': { top++; st[top] = p; k = 1; break; } case ')': { top--; break; } case ',': { k = 2; break; } default: { p = (BTNode*)malloc(sizeof(BTNode)); if (NULL == p) { return; } p->data = ch; p->left = p->right = NULL; if (!root) { root = p; } else { switch (k) { case 1: st[top]->left = p; break; case 2: st[top]->right = p; break; } } break; } } ch = str[++i]; } } void DispBTNode(BTNode *&root) { if (root) { printf("%c", root->data); if (root->left || root->right) { printf("("); DispBTNode(root->left); if (root->right) { printf(","); DispBTNode(root->right); } printf(")"); } } } int GetBTNodeDepth(BTNode *&root) { int iLeftDepth = 0; int iRightDepth = 0; if (!root) { return 0; } iLeftDepth = GetBTNodeDepth(root->left); iRightDepth = GetBTNodeDepth(root->right); return (iLeftDepth > iRightDepth ? (iLeftDepth+1):(iRightDepth+1)); } void PreOrder(BTNode *&root) { if (root) { printf("%c\t", root->data); PreOrder(root->left); PreOrder(root->right); } } void PreOrder1(BTNode *&root) { int top = -1; BTNode *p = NULL; BTNode *st[MAX] = {NULL}; if (root) { top++; st[top] = root; while (top > -1) { p = st[top]; top--; printf("%c\t", p->data); if (p->right) { top++; st[top] = p->right; } if (p->left) { top++; st[top] = p->left; } } } } void InOrder(BTNode *&root) { if (root) { PreOrder(root->left); printf("%c\t", root->data); PreOrder(root->right); } } void PostOrder(BTNode *&root) { if (root) { PreOrder(root->left); PreOrder(root->right); printf("%c\t", root->data); } } int _tmain(int argc, _TCHAR* argv[]) { BTNode *root = NULL; char *str = "A(B(D(,G)),C(E,F))"; CreateBTNode(root, str); DispBTNode(root); printf("\r\n"); printf("The BTree's Depth = %d\r\n", GetBTNodeDepth(root)); printf("PreOrder:\r\n"); PreOrder(root); printf("\r\n"); printf("InOrder:\r\n"); InOrder(root); printf("\r\n"); printf("PostOrder:\r\n"); PostOrder(root); printf("\r\n"); return 0; }