struct TreeNode {
char val;
struct TreeNode *left;
struct TreeNode *right;
};
void PreOrderTraverse(struct TreeNode * T){
if(T!=NULL){
printf("%c", T->val);
PreOrderTraverse(T->left);
PreOrderTraverse(T->right);
}
}
void InOrderTraverse(struct TreeNode * T){
if(T!=NULL){
InOrderTraverse(T->left);
printf("%c", T->val);
InOrderTraverse(T->right);
}
}
void PostOrderTraverse(struct TreeNode * T){
if(T!=NULL){
PostOrderTraverse(T->left);
PostOrderTraverse(T->right);
printf("%c", T->val);
}
}
//中序迭代打印二叉树
//左右均未被访问,入站
//站中节点都是左访问右未
void InOderIteration(struct TreeNode * T){
stack<struct TreeNode *> stk;
struct TreeNode *p = T;
while(p!=NULL || !stk.empty()){
while (p!=NULL) {
stk.push(p);
p = p -> left;
}
p = stk.top();
stk.pop();
printf("%c", p->val);
p = p -> right;
}
}
struct TreeNode * CreatBinTree(){
char ch;
scanf("%c",&ch);
if(ch == '#') return NULL;
else{
struct TreeNode * T = (struct TreeNode *)malloc(sizeof(struct TreeNode));
T -> val = ch;
T -> left = CreatBinTree();
T -> right = CreatBinTree();
return T;
}
}
//先序复制二叉树
struct TreeNode * CopyBinTree (struct TreeNode * T){
if(T==NULL) return NULL;
else{
struct TreeNode * NewT = (struct TreeNode *)malloc(sizeof(struct TreeNode));
NewT -> val = T->val;
NewT -> left = CopyBinTree(T -> left);
NewT -> right = CopyBinTree(T -> right);
return NewT;
}
}
//计算二叉树的深度
int DepthBinTree(struct TreeNode * T){
if( T== NULL) return 0;
else{
int DepthLeft = DepthBinTree(T->left);
int DepthRight = DepthBinTree(T->right);
return 1 + fmax(DepthLeft, DepthRight);
}
}
//计算节点个数
int NodeCount(struct TreeNode * T){
if(T==NULL) return 0;
else{
return 1 + NodeCount(T->left) + NodeCount(T->right);
}
}
void PrintBinTree(struct TreeNode * T){
printf("PreOerderTraverse:");
PreOrderTraverse(T);
printf("\n");
printf("InOrderTraverse:");
InOrderTraverse(T);
printf("\n");
printf("PostOrderTraverse:");
PostOrderTraverse(T);
printf("\n");
printf("InOderIteration:");
InOderIteration(T);
printf("\n");
}
int main() {
struct TreeNode * T = NULL;
T = CreatBinTree();
PrintBinTree(T);
//复制一颗二叉树
struct TreeNode * NewT = NULL;
NewT = CopyBinTree(T);
PrintBinTree(NewT);
printf("二叉树的深度:%d\n", DepthBinTree(T));
printf("二叉树的节点个数:%d\n", NodeCount(T));
return 0;
}