树
#include<iostream>
#include<stdio.h>
#include<string>
#include<queue>
#define MAX 1000
using namespace std;
typedef char Elemtype;
typedef struct node {
Elemtype data;
int index;
int layer;//层次
struct node *lchild, *rchild;
} BiTnode, *BiTtree;
typedef struct Tree {
Elemtype Data;
char Lchild;
char Rchild;
} TreeNode;
void creatBTree(BiTtree &bt) {
Elemtype ch;
cin >> ch;
if (ch == '#')
bt = NULL; //递归结束的标志??
else {
bt = (BiTnode *)malloc(sizeof(BiTnode));
bt->data = ch;
creatBTree(bt->lchild);
creatBTree(bt->rchild);
}
// 先左后右
}
static int j = 1;
void Create_QuietTree(BiTtree T, TreeNode a[]) {
if (T->lchild != NULL)
Create_QuietTree(T->lchild, &a[0]);
a[j].Data = T->data;
if (T->rchild == NULL)
a[j].Rchild ='*';
else
a[j].Rchild = T->rchild->index+48 ;//数字转字符(char)T->rchild->index强制类型转换
// itoa(T->rchild->index,a[j].Rchild,10);
if (T->lchild == NULL)
a[j].Lchild = '*';
else
a[j].Lchild = T->lchild->index+48;
// itoa(T->lchild->index,a[j].Lchild,10);
j++;
if (T->rchild != NULL)
Create_QuietTree(T->rchild, &a[0]);
}//中序储存到静态数组中
static int i = 1;
void INorderTrverse(BiTtree &bt) { //中序遍历
if (bt) {
//TODO
INorderTrverse(bt->lchild);
cout << bt->data << " ";
bt->index = i;
i++;
INorderTrverse(bt->rchild);
}
}
void PreOrderTraverse(BiTtree bt) { //先序遍历
if (bt) {
cout << bt->data << " ";
PreOrderTraverse(bt->lchild);
PreOrderTraverse(bt->rchild);
}
}
void PreOrderTraverse2(BiTtree bt) { //非递归
BiTtree Stack[MAX], p;
int top;
if (bt == NULL) return;
top = 0;
Stack[top++] = bt;
while (top > 0) {
p = Stack[--top];
printf("%c ", p->data);
if (p->rchild) {
Stack[top++] = p->rchild;
}
if (p->lchild) {
Stack[top++] = p->lchild;
}
}
}
int GetBiTNodeCount(BiTtree bt){//统计二叉树节点数
if(bt==NULL) return 0;
int LeftCount=GetBiTNodeCount(bt->lchild);
int RightCount=GetBiTNodeCount(bt->rchild);
return RightCount+LeftCount+1;
}
void PoseOrderTraverse(BiTtree bt) { //后序
if (bt) {
PoseOrderTraverse(bt->lchild);
PoseOrderTraverse(bt->rchild);
cout << bt->data << " ";
}
}
/*利用队列进行层次遍历,用一个while循环,循环结束条件为队列不为空时 */
void LayerOrder(node *root) {
queue<node *>q;
root->layer = 1;
q.push(root);
while (!q.empty()) {
node *now = q.front();
q.pop();
printf("%c ", now->data);
if (now->lchild != NULL) {
now->lchild->layer = now->layer + 1;
q.push(now->lchild);
}
if (now->rchild != NULL) {
now->rchild->layer = now->layer + 1;
q.push(now->rchild);
}
}
}
void InOrderTraverse(BiTtree T ) {//非递归中序遍历,栈的思想
BiTtree Stack[MAX], p;
int top = 0;
p = T;
while (p != NULL) {
Stack[top] = p;
top++;//4
p = p->lchild;
}
while (top > 0) {
top--;
p = Stack[top];
printf("%c ", p->data);
p = p->rchild;
while (p != NULL) {
Stack[top] = p;
top++;
p = p->lchild;
}
}
}
int LeafNodeCount(BiTtree T){//统计叶子结点个数
if(T==NULL) return 0;
else if(T->lchild==NULL&&T->rchild==NULL) return 1;//递归结束条件
else
return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);
}
int CountNode1(BiTtree bt){//度为1的结点个数
int n1,n2;
if(bt==NULL||(bt->lchild==NULL)&&(bt->rchild==NULL)) return 0;
n1=CountNode1(bt->lchild);
n2=CountNode1(bt->rchild);
if(bt->lchild!=NULL&&bt->rchild!=NULL) return n1+n2;
return n1+n2+1;
}
int CountNode2(BiTtree bt){//统计度为2的结点个数
int n1,n2;
if(bt==NULL||(bt->lchild==NULL)&&(bt->rchild==NULL)) return 0;
n1=CountNode2(bt->lchild);
n2=CountNode2(bt->rchild);
if(bt->lchild!=NULL&&bt->rchild!=NULL) return n1+n2+1;
return n1+n2;
}
int BitreeHeight(BiTtree T){
if(T==NULL) return 0;
else{
int h1,h2;
h1=BitreeHeight(T->lchild);
h2=BitreeHeight(T->rchild);
return (h1>h2?h1:h2)+1;
}
}
int NodeLevel(BiTtree T,Elemtype x){
if(T==NULL) return 0;
if(T->data==x) return 1;
int c1=NodeLevel(T->lchild,x);
if(c1>1) return c1+1;
int c2=NodeLevel(T->rchild,x);
if(c2>1) return c2+1;
r eturn 0;
}
// int JudgeComplete(BiTtree bt){
// int tag=1;//tag表示有
// }
int main() {
BiTtree bt;
TreeNode a[100];
cout << "plase input a binaryTree:(先序创建)" << endl;
creatBTree(bt);
cout << "先序:" << endl;
PreOrderTraverse2(bt);
cout << endl;
cout << "后序:" << endl;
PoseOrderTraverse(bt);
cout << endl;
cout << "中序遍历:" << endl;
INorderTrverse(bt);
// InOrderTraverse(bt);
cout << endl;
cout << "层序遍历" << endl;
LayerOrder(bt);
Create_QuietTree(bt, &a[0]);
cout << endl;
int K;
printf("中序遍历编号\t头节点\t\t左孩子\t\t右孩子\\ps:愿天堂再无bug,折寿啊\n");
for (K = 1; K < j; K++) { //i?
printf("%d\t\t%c\t\t%c\t\t%c\n", K, a[K].Data, a[K].Lchild, a[K].Rchild);
// cout<<K<<a[K].Data<<a[K].Lchild<<a[K].Rchild<<endl;
}
printf("结点个数:%d\n",GetBiTNodeCount(bt));
cout<<"叶子结点个数:"<<LeafNodeCount(bt)<<endl;
cout<<"度为1的结点个数"<<CountNode1(bt)<<endl;
cout<<"度为2的节点个数"<<CountNode2(bt)<<endl;
cout<<"树的高度"<<BitreeHeight(bt)<<endl;
cout<<"结点A在第"<<NodeLevel(bt,'A')<<"层"<<endl;
return 0;
}
//ABC##F##D#E##