#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#define Status int
#define ERROR -1
#define OK 1
#define FALSE 0
#define MAXSIZE 30
using namespace std;
typedef struct Tree{
int data;
struct Tree* left;
struct Tree* right;
}Tree,*BiTree;
void initTree(BiTree &tree){
tree->left = NULL;
tree->right = NULL;
}
Status createTree(BiTree &tree){
int in;
scanf("%d",&in);
if(in == -1){
tree = NULL;
}else{
tree = new Tree;
tree->data = in;
createTree(tree->left);
createTree(tree->right);
}
return OK;
}
void visit(BiTree tree){
printf("%d\t",tree->data);
}
Status preOrder(BiTree tree){
if(tree == NULL ){
return ERROR;
}
visit(tree);
preOrder(tree->left);
preOrder(tree->right);
return OK;
}
void NnredursionPreorder(BiTree tree){
int top = -1;
BiTree data[MAXSIZE];
while(top != -1 || tree!=NULL){
if(tree!=NULL){
printf("%d\t",tree->data);
top++;
data[top] = tree;
tree = tree->left;
}else{
tree = data[top];
top--;
tree = tree->right;
}
}
}
Status inOrder(BiTree tree){
if(tree == NULL){
return ERROR;
}
inOrder(tree->left);
visit(tree);
inOrder(tree->right);
return OK;
}
void NnredursionInorder(BiTree tree){
int top = -1;
BiTree data[MAXSIZE];
while(top != -1 || tree!=NULL){
if(tree!=NULL){
top++;
data[top] = tree;
tree = tree->left;
}else{
tree = data[top];
printf("%d\t",tree->data);
top--;
tree = tree->right;
}
}
}
Status postOrder(BiTree tree){
if(tree == NULL){
return ERROR;
}
postOrder(tree->left);
postOrder(tree->right);
visit(tree);
return OK;
}
Status levelOrder(BiTree tree){
if(tree == NULL){
return ERROR;
}
int top = 0,rear = 0;
BiTree data[MAXSIZE];
top = (top+1)%MAXSIZE;
data[top] = tree;
while(top != rear){
BiTree node = data[(rear+1)%MAXSIZE];
printf("%d\t",node->data);
rear = (rear+1)%MAXSIZE;
if(node->left != NULL){
top = (top+1)%MAXSIZE;
data[top] = node->left;
}
if(node->right != NULL){
top = (top+1)%MAXSIZE;
data[top] = node->right;
}
}
return OK;
}
int deepTree(BiTree tree){
if(tree == NULL){
return 0;
}
return max(deepTree(tree->left),deepTree(tree->right))+1;
}
int getNodeNumber(BiTree tree){
if(tree == NULL){
return 0;
}
return getNodeNumber(tree->left) + getNodeNumber(tree->right) +1;
}
int getLeafNodeNumber(BiTree tree){
if(tree == NULL){
return 0;
}
if(tree->left == NULL && tree->right == NULL){
return 1;
}else{
return getLeafNodeNumber(tree->left) + getLeafNodeNumber(tree->right);
}
}
int main(){
BiTree tree = new Tree;
initTree(tree);
createTree(tree);
NnredursionPreorder(tree);
printf("深度: %d\t",deepTree(tree));
printf("节点总数: %d\t",getNodeNumber(tree));
printf("叶子节点总数: %d",getLeafNodeNumber(tree));
}