给定一个数组,写个程序构造一个最矮的二叉树

思路:

尽量保证左子树和右子树含有相同数目的节点。

1.用数组中间元素构造根节点;

2.用中间元素左边的元素构造左子树;

3.用中间元素右边的 元素构造右子树。

代码:

下面的代码给出了两种实现的函数:create_tree1()和create_tree2()。读者可以观察一下二者的区别。

#include<stack>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

class node    
{    
public:    
    int key;  // value of node    
    node* lp; // pointer to left child    
    node* rp; // pointer to right child    
    node(int k, node*lpp, node* rpp)    
    {    
        key = k;    
        lp = lpp;    
        rp = rpp;    
    }    
};  

void preorder1(node* root)  
{    //这个preorder1来自于:http://blog.csdn.net/jiyanfeng1/article/details/8038903 
    std::stack<node*> st;    
    if(root!=NULL)    
        st.push(root);    
    node* tmp;    
    while(!st.empty())    
    {    
        tmp = st.top();    
        st.pop();    
        cout<<tmp->key<<endl;    
        if(tmp->rp!=NULL)    
            st.push(tmp->rp);    
        if(tmp->lp!=NULL)    
            st.push(tmp->lp);    
    }    
}    

node* create_tree1(int* start, int num)//这是个笨的办法
{

	if(num<=0)
		return NULL;
	else if(num==1)
		return new node(*start, NULL, NULL);
	else
	{
		node* left_root = NULL;
		node* right_root = NULL;
		int* mid = start+num/2;

		left_root = create_tree1(start, num/2);
		if(num>2)		//不过要仔细读一下这几句代码
			if(num & 1)	//弄清一个数列,劈成两半,左半和右半的数量关系
				right_root = create_tree1(mid+1, num/2);
			else
				right_root = create_tree1(mid+1, num/2-1);

		return new node(*mid, left_root, right_root);
	}
}

node* create_tree2(int* arr, int start, int end)//这个更好
{
	if(start>end)
		return NULL;
	else
	{
		int mid = (start+end)/2;
		node* left = create_tree2(arr, start, mid-1);
		node* right = create_tree2(arr, mid+1, end);

		return new node(arr[mid], left, right);
	}
}

int main()
{
	int arr[] = {0,1,2,3,4,5,6,7,8,9,10};
	node* root1 = create_tree1(arr, 11);
	preorder1(root1);

	//检验create_tree2()的作用
	node* root2 = create_tree2(arr, 0,10);
	preorder1(root2);
	int i=0;
	scanf("%d",i);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是按照层序构造一棵二叉树的C语言代码实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; typedef struct QueueNode { TreeNode* node; struct QueueNode* next; } QueueNode; typedef struct { QueueNode* front; QueueNode* rear; } Queue; Queue* createQueue() { Queue* queue = (Queue*)malloc(sizeof(Queue)); queue->front = NULL; queue->rear = NULL; return queue; } int isEmpty(Queue* queue) { return queue->front == NULL; } void enqueue(Queue* queue, TreeNode* node) { QueueNode* queueNode = (QueueNode*)malloc(sizeof(QueueNode)); queueNode->node = node; queueNode->next = NULL; if (isEmpty(queue)) { queue->front = queueNode; queue->rear = queueNode; } else { queue->rear->next = queueNode; queue->rear = queueNode; } } TreeNode* dequeue(Queue* queue) { if (isEmpty(queue)) { return NULL; } QueueNode* front = queue->front; TreeNode* node = front->node; queue->front = front->next; free(front); if (queue->front == NULL) { queue->rear = NULL; } return node; } TreeNode* buildTree(int* arr, int arrSize) { if (arrSize == 0) { return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = arr[0]; root->left = NULL; root->right = NULL; Queue* queue = createQueue(); enqueue(queue, root); int i = 1; while (!isEmpty(queue)) { TreeNode* curNode = dequeue(queue); if (i < arrSize && arr[i] != NULL) { curNode->left = (TreeNode*)malloc(sizeof(TreeNode)); curNode->left->val = arr[i]; curNode->left->left = NULL; curNode->left->right = NULL; enqueue(queue, curNode->left); } i++; if (i < arrSize && arr[i] != NULL) { curNode->right = (TreeNode*)malloc(sizeof(TreeNode)); curNode->right->val = arr[i]; curNode->right->left = NULL; curNode->right->right = NULL; enqueue(queue, curNode->right); } i++; } return root; } void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); } int main() { int arr[] = {1, 2, 3, 4, NULL, 5, 6, NULL, NULL, 7, NULL, NULL, NULL, NULL, NULL}; int arrSize = sizeof(arr) / sizeof(int); TreeNode* root = buildTree(arr, arrSize); inorderTraversal(root); // 输出:4 2 5 1 6 3 7 return 0; } ``` 这个C语言程序可以根据输入的数组构造出一棵二叉树,并输出中序遍历结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值