22.遍历二叉树
题目描述
给出一个n个节点的二叉树,请求出二叉树的前序遍历,中序遍历和后序遍历。
输入描述
第一位一个整数n表示左儿子序号,第二个表示右儿子序号,如果该序号为0表示没有。 (例如下面示例中,F序号为1,C序号为2,E序号为3,A序号为4,D序号为5,G序号为6,B序号为7)
输出描述
共三行,第一行为二叉树的前序遍历,第二行为中序遍历,第三行为后序遍历
输入示例
7
F 2 3
C 4 5
E 0 6
A 0 0
D 7 0
G 0 0
B 0 0
输出示例
FCADBEG
ACBDFEG
ABDCGEF
题解(C语言):
#include <stdio.h>
#include <stdlib.h>
// 树结构体
typedef struct TreeNode{
char val;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;
// 前序遍历
void PreOrder(TreeNode *root){
if(root == NULL) return;
printf("%c",root -> val);
PreOrder(root -> left);
PreOrder(root -> right);
}
// 中序遍历
void InOrder(TreeNode *root){
if(root == NULL) return;
InOrder(root->left);
printf("%c",root->val);
InOrder(root->right);
}
// 后序遍历
void PostOrder(TreeNode *root){
if(root == NULL) return;
PostOrder(root->left);
PostOrder(root->right);
printf("%c",root->val);
}
// 创建树
TreeNode *CreatTree(char elem[],int A[],int B[],int Index){
if(Index == 0) return NULL;
TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
root->val = elem[Index-1];
// 构建左子树
if(A[Index-1]){
root->left = CreatTree(elem,A,B,A[Index-1]);
}
// 构建右子树
if(B[Index-1]){
root -> right = CreatTree(elem,A,B,B[Index-1]);
}
return root;
}
int main(){
int n;
scanf("%d",&n);
getchar();
char elem[n];
int A[n],B[n],i=0;
while(scanf("%c",&elem[i]) != EOF){
scanf("%d %d",&A[i],&B[i]);
i++;
getchar();
}
TreeNode *root = CreatTree(elem,A,B,1);
PreOrder(root);
printf("\n");
InOrder(root);
printf("\n");
PostOrder(root);
return 0;
}
23.二叉树的高度
题目描述
现给定一棵二叉树的先序遍历序列和中序遍历序列,要求你计算该二叉树的高度。
输入描述
输入包含多组测试数据,每组输入首先给出正整数N(<=50),为树中结点总数。下面2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出描述
对于每组输入,输出一个整数,即该二叉树的高度。
输入示例
9
ABDFGHIEC
FDHGIBEAC
7
Abcdefg
gfedcbA
输出示例
5
7
题解(C语言):
#include <stdio.h>
#include <stdlib.h>
// 树结构体
typedef struct TreeNode{
char val;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode;
// 根据先序遍历和中序遍历创建树
TreeNode *PreInCreate(char PreOrder[], char InOrder[], int l1, int h1, int l2, int h2){
// l1和h1为左子树中的第一个和最后一个下标
// l2和h2为右子树中的第一个和最后一个下标
// 初始时l1=l2=0,h1=h2=n-1
TreeNode *root = (TreeNode *)malloc(sizeof(TreeNode));
root -> val = PreOrder[l1];
int i = 0;
for(i = l2; InOrder[i] != root -> val; i++);
int l_len = i - l2; // 左子树长度
int r_len = h2 - i; // 右子树长度
if(l_len){
root -> left = PreInCreate(PreOrder, InOrder, l1+1, l1 + l_len, l2, l2+l_len-1);
}else root -> left = NULL;
if(r_len){
root -> right = PreInCreate(PreOrder, InOrder, h1-r_len+1, h1, h2-r_len+1, h2);
}else root -> right = NULL;
return root;
}
// 计算二叉树高度
int GetHeight(TreeNode* root) {
if (root == NULL) {
return 0;
}
int leftHeight = GetHeight(root->left);
int rightHeight = GetHeight(root->right);
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
int main(){
int n;
while(scanf("%d",&n) != EOF){
getchar();
char PreOrder[n], InOrder[n];
scanf("%s %s",PreOrder,InOrder);
getchar();
TreeNode *root = PreInCreate(PreOrder,InOrder,0,n-1,0,n-1);
printf("%d\n",GetHeight(root));
}
}