86.
怎样编写一个程序,把一个有序整数数组放到二叉树中?
分析:本题考察二叉搜索树的建树方法,简单的递归结构。关于树的算法设计一定要联想到
递归,因为树本身就是递归的定义。而,学会把递归改称非递归也是一种必要的技术。毕竟,
递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。但是对某些数学问题,
就一定要学会用递归去解决。
/*
86.
怎样编写一个程序,把一个有序整数数组放到二叉树中?
分析:本题考察二叉搜索树的建树方法,简单的递归结构。关于树的算法设计一定要联想到
递归,因为树本身就是递归的定义。而,学会把递归改称非递归也是一种必要的技术。毕竟,
递归会造成栈溢出,关于系统底层的程序中不到非不得以最好不要用。但是对某些数学问题,
就一定要学会用递归去解决。
有序的,直接中间分开 左右子树建立递归
*/
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
#define N 101
struct Node{
int data;
struct Node *left,*right;
};
Node* bulidTree(int array[], int start, int end)
{
if (start>end)
return NULL;
int m=(start+end)/2;
Node *root=(Node*)malloc(sizeof(Node));
root->data=array[m];
root->left=bulidTree(array,start,m-1);
root->right=bulidTree(array,m+1,end);
return root;
}
// 中序遍历 左根右
void displayTreeMid(Node *head)
{
if(head->left)
displayTreeMid(head->left);
printf("%d ",head->data);
if(head->right)
displayTreeMid(head->right);
}
// 前序遍历 根左右
void displayTreeFore(Node *head)
{
printf("%d ",head->data);
if(head->left)
displayTreeFore(head->left);
if(head->right)
displayTreeFore(head->right);
}
// 后序遍历 左右根
void displayTreeBack(Node *head)
{
if(head->left)
displayTreeBack(head->left);
if(head->right)
displayTreeBack(head->right);
printf("%d ",head->data);
}
int main()
{
/*
5
2 7
1 3 6 8
4 9
中序遍历:1 2 3 4 5 6 7 8 9
前序遍历:5 2 1 3 4 7 6 8 9
后序遍历:1 4 3 2 6 9 8 7 5
*/
int array[]={1,2,3,4,5,6,7,8,9};
Node *root;
root=bulidTree(array,0,sizeof(array)/sizeof(int)-1);
printf("中序遍历:");
displayTreeMid(root);
printf("\n");
printf("前序遍历:");
displayTreeFore(root);
printf("\n");
printf("后序遍历:");
displayTreeBack(root);
printf("\n");
return 0;
}