binary tree to list

/*
 * tree.cpp
 *
 *  Created on: 2014-2-4
 *      Author: aeris
 */
#include <iostream>
#include <vector>
#include <queue>
#include <cstdlib>
using namespace std;

struct node{
	int name;
	node * left_child;
	node * right_child;
};

node * create_tree(const vector<int> &tree_node, int start, int end){
	if(tree_node.empty())return NULL;
	node *new_node;
	try{
		new_node = new node;
		new_node->name = tree_node[start];
		new_node->left_child = NULL;
		new_node->right_child = NULL;
	}
	catch(bad_alloc){
		exit(1);
	}

	if(start == end) {
		return new_node;
	}
	int pos = start + (end - start + 1 )/2;
	new_node->name = tree_node[pos];
	new_node->left_child = create_tree(tree_node, start, pos-1);
	new_node->right_child = create_tree(tree_node, pos+1, end);
	return new_node;
}

void print_tree(node *head){
	if (head == NULL) return;
	queue<node *> node_c;
	node *item, *p;
	try{
		p = new node;
		p->name = '#';
		p->left_child = NULL;
		p->right_child = NULL;
	}
	catch(bad_alloc){
		exit(1);
	}
	node_c.push(head);
	node_c.push(p);
	while(!node_c.empty()){
		item = node_c.front();
		if(item->name == '#'){
			if(node_c.size()==1)return;
			cout<<endl;
			node_c.pop();
			node_c.push(p);
			continue;
		}
		if(item->left_child != NULL)node_c.push(item->left_child);
		if(item->right_child != NULL)node_c.push(item->right_child);
		cout<<item->name;
		node_c.pop();
	}
}

node *tree_to_list(node * sub_node, int level){ //level 0 == left else 1
	if (sub_node == NULL)return NULL;
	if(sub_node->left_child == NULL && sub_node->right_child == NULL){
		return sub_node;
	}
	if(level==0 && sub_node->left_child == NULL){
			return sub_node;
	}

	if(level==1 && sub_node->right_child == NULL){
		return sub_node;
	}
	node *left = tree_to_list(sub_node->left_child, 1);
	node *right = tree_to_list(sub_node->right_child, 0) ;

	sub_node->left_child = left;
	sub_node->right_child = right;
	left->right_child = sub_node;
	right->left_child = sub_node;
	if(level == 0){
		while(sub_node->left_child != NULL)sub_node = sub_node->left_child;
		return sub_node;
	}
	if(level == 1){
		while(sub_node->right_child != NULL)sub_node = sub_node->right_child;
		return sub_node;
	}
}

int main(){
	int node_s[7] = {1,2,3,4,5,6,7};
	vector<int> node_v(node_s, node_s +7);
	node * head = create_tree(node_v, 0, 6);
	print_tree(head);
	node * list = tree_to_list(head, 0);
	//while(list->left_child != NULL)list= list->left_child;
	if (list == NULL){
		cout<<"the list is null"<<endl;
		exit(1);
	}
	cout<<endl;
	while(list != NULL){
		cout<<list->name;
		list = list->right_child;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值