这可真够烦的…
#include<stdio.h> #include<stdlib.h> typedef char ElemType; int n=0; typedef struct BinaryTreeNode { ElemType Data; struct BinaryTreeNode *lChild, *rChild; }BinaryTreeNode; typedef BinaryTreeNode* BiTree; typedef struct BinaryTree{ BinaryTreeNode *root; }BinaryTree; void PreOrderTransverse(BiTree t) { if (t == NULL) return; n++; printf(" %c", t->Data); PreOrderTransverse(t->lChild); PreOrderTransverse(t->rChild); } void InOrderTransverse(BiTree t) { if (t == NULL) return; InOrderTransverse(t->lChild); printf(" %c", t->Data); InOrderTransverse(t->rChild); } void PostOrderTransverse(BiTree t) { if (t == NULL) return; PostOrderTransverse(t->lChild); PostOrderTransverse(t->rChild); printf(" %c", t->Data); } BinaryTreeNode* PreCreateBt(BinaryTreeNode *t) { char ch; ch = getchar(); getchar(); if (ch == '#') t = NULL; else { t = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode)); t->Data = ch; t->lChild = PreCreateBt(t->lChild); t->rChild = PreCreateBt(t->rChild); } return t; } int Max(int a, int b) { return a >= b ? a : b; } int SizeH(BinaryTree Bt) { return SizeofHigh(Bt.root); } int SizeofHigh(BinaryTreeNode *p) { if (p == NULL) return 0; if (p->lChild == NULL && p->rChild == NULL) return 1; return Max(SizeofHigh(p->lChild), SizeofHigh(p->rChild)) + 1; } int SizeL(BinaryTree Bt) { return SizeofLeaf(Bt.root); } int SizeofLeaf(BinaryTreeNode *p) { if (!p) return 0; if ((!(p->lChild)) && (!(p->rChild))) return 1; return SizeofLeaf(p->lChild) + SizeofLeaf(p->rChild); } int main() { BinaryTree myTree; int n0, n1, n2,h; myTree.root = NULL; myTree.root = PreCreateBt(myTree.root); printf("PreOrder:"); PreOrderTransverse(myTree.root); printf("\n"); printf("InOrder:"); InOrderTransverse(myTree.root); printf("\n"); printf("PostOrder:"); PostOrderTransverse(myTree.root); printf("\n"); h = SizeH(myTree); printf("%d\n", h); n0 = SizeL(myTree); if (h == 0) n0 = n1 = n2 = 0; else { n2 = n0 - 1; n1 = n - n0 - n2; } printf("%d %d %d\n",n, n0,n1); return 0; }
《NOJ1019 计算二叉树的高度和结点数》有1个想法