/*
* 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;
}
}
binary tree to list
最新推荐文章于 2023-10-12 00:33:33 发布