送一段示例。
时间仓促,只做了一两组测试,不排除存在BUG,欢迎指正
程序代码:
#include<stdio.h>
#include<malloc.h>
//结点定义
typedef struct _node
{
int value;
struct _node *left;
struct _node *right;
} NODE;
//生成结点
NODE * newNode()
{
NODE * p;
p = (NODE *)malloc(sizeof(NODE));
if(p == NULL) return NULL;
p->value = 0;
p->left = NULL;
p->right = NULL;
return p;
}
//销毁结点
void disposeNode(NODE * p)
{
free(p);
}
//销毁树
void disposeTree(NODE * root)
{
if(root->left != NULL) disposeTree(root->left);
if(root->right != NULL) disposeTree(root->right);
disposeNode(root);
}
//根据先序与中序遍历结果重建树
// preorder: 先序遍历结果数组
// inorder: 中序遍历结果数组
// len: 数组的长度
// 返回值: 指向树根结点的指针
NODE * buildTree(int * preorder, int * inorder, int len)
{
int i;
NODE * root;
if(len <= 0) return NULL;
root = newNode();
root->value = preorder[0];
for(i = 0; i < len && inorder[i] != preorder[0]; i++);
if(i == len) return NULL;
root->left = buildTree(preorder + 1, inorder, i);
root->right = buildTree(preorder + i + 1, inorder + i + 1, len - i - 1);
return root;
}
void subShowTree(NODE * root, int deep)
{
int i;
if(root == NULL) return;
printf("%-5d", root->value);
if(root->right != NULL) subShowTree(root->right, deep + 1);
if(root->left != NULL)
{
printf("\n");
for(i = 0; i < deep; i++) printf(" ");
printf("+ ");
subShowTree(root->left, deep + 1);
}
}
//打印树的结构
//结果中某一元素右侧的值为它的右子结点的值,其正对下方的+号右侧的值为它的左子结点的值
void showTree(NODE * root)
{
subShowTree(root, 0);
}
int main()
{
int preorder[] = {1, 2, 4, 5, 7, 3, 6};
int inorder[] = {4, 2, 7, 5, 1, 3, 6};
NODE * tree;
tree = buildTree(preorder, inorder, 9);
showTree(tree);
disposeTree(tree);
return 0;
}
输出的结果为
1
3
6
+
2
5
+
7
+
4
结果的意义我在输出函数前的注释里解释了,不理解我再解释。