二叉树的建立、遍历规则、以及节点计算
二叉树故名思意就是只有两个度的树,这里讨论其最基本的用法及逻辑。

树的创立
定义一颗二叉树首先要有一个度里的数据data,以及左右孩子,我们可以用结构体定义以方便其理解。
结构体定义:
1 2 3 4 5 6 7 8
   | typedef char ElementType; typedef struct TNode *Position; typedef Position BinTree; struct TNode{     ElementType Data;     BinTree Left;     BinTree Right; };
 
  | 
 
我们给左右孩子分别定位Left和Right,这样我们就可以使用T->Left和T->Right等方式进行调用,利于理解。
树的构建:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | binTree creatBintree() { 	int a; 	binTree b; 	scanf("%d", &a); 	if (0 == a)	 		b = NULL; 	else 	{ 		b = (binTree)malloc(sizeof(struct binNode)); 		b->element = a; 		b->leftChild = creatBintree(); 		b->rightChild = creatBintree(); 		 	} 	return b; }
 
  | 
 
树的遍历
当我们构建起了一个树后我们怎么对树进行遍历读取呢?可以用前、中、后序遍历,打比方我们用前序遍历就是通过(根、左、右)对树进行读取,也就是首先将最上面的节点作为root,然后将所有左边和右边的节点看作孩子,然后再将此时左孩子最上面的节点作为root进一步(根、左、右)读取,以此类推进行遍历。我们可以用递归的方式来实现代码。
前序遍历
1 2 3 4 5 6 7 8 9
   | void PreorderPrintLeaves( BinTree BT ) {     if(BT==NULL) return;     if(BT->Left==NULL && BT->Right==NULL){         printf(" %c",BT->Data);      }     PreorderPrintLeaves(BT->Left);     PreorderPrintLeaves(BT->Right); }
 
  | 
 
中序遍历
1 2 3 4 5 6 7 8 9
   | void PreorderPrintLeaves( BinTree BT ) {     if(BT==NULL) return;     PreorderPrintLeaves(BT->Left);     if(BT->Left==NULL && BT->Right==NULL){         printf(" %c",BT->Data);     }         PreorderPrintLeaves(BT->Right); }
 
  | 
 
后序遍历
1 2 3 4 5 6 7 8 9
   | void PreorderPrintLeaves( BinTree BT ) {     if(BT==NULL) return;     PreorderPrintLeaves(BT->Left);       PreorderPrintLeaves(BT->Right);     if(BT->Left==NULL && BT->Right==NULL){         printf(" %c",BT->Data);     }   }
 
  | 
 
节点的计算
节点的计算需要通过左右子树的孩子判断来对其进行加法运算,我们可以用T->lchild!=NULL来表示没有左孩子,同理可以右孩子也是T->rchild!=NULL,这样就可以区分度为1、2或叶子节点。
计算节点数
1 2 3 4 5
   | int NodeCount ( BiTree T) {     if(T==NULL) return 0;     else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;  }
 
  | 
 
计算度为1的节点数
1 2 3 4 5 6
   | int NodeCount ( BiTree T){     if(T==NULL) return 0;     if(( T->lchild!=NULL && T->rchild==NULL) || ( T->lchild==NULL && T->rchild!=NULL))         return NodeCount(T->lchild)+NodeCount(T->rchild)+1;      return NodeCount (T->lchild)+NodeCount (T->rchild);  }
 
  | 
 
计算度为2的节点数
1 2 3 4 5 6
   | int NodeCount ( BiTree T){     if(T==NULL) return 0;     if( T->lchild!=NULL && T->rchild!=NULL)         return 1+NodeCount (T->lchild)+NodeCount (T->rchild);     return NodeCount (T->lchild)+NodeCount (T->rchild); }
 
  | 
 
计算叶子节点个数
1 2 3 4 5
   | int LeafCount ( BiTree T){     if(T == NULL) return 0;     if(T->lchild==NULL && T->rchild==NULL) return 1;     return LeafCount(T->lchild)+LeafCount(T->rchild); }
 
  | 
 
树高计算
我们可以定义两个整型m,n分别来表示左右两边的树高度,用递归的方式实现向下计算。
1 2 3 4 5 6 7 8 9 10 11 12 13
   | int GetHeight( BinTree BT ){      int m, n;      if (BT == NULL)          return 0;      else{          m = GetHeight(BT->Left);          n = GetHeight(BT->Right);          if (m > n)              return (m + 1);         else              return (n + 1);      }  }
 
  |