二叉查找树(BST)---创建 清空 遍历

本文介绍了一种使用C++实现的二叉树数据结构,包括二叉树的创建、遍历(前序、中序、后序、层次遍历)及删除等基本操作。此外,还提供了一个完整的示例程序,演示了如何通过用户输入来构建二叉树,并展示了不同类型的遍历结果。
#include <iostream>
#include 
<queue>
#include 
<stdlib.h>
using namespace std;

//定义树结构
typedef struct tree_node_tag{
    
int value;
    
struct tree_node_tag *left;
    
struct tree_node_tag *right;
}
 TreeNode;

//通过父节点插入建立二叉树
void insert_node(TreeNode *parent, TreeNode *node)
{
    
if (!parent)    //插入时必须确保父节点不为空
    {
        cout 
<< "parent not null" << endl;
        
return;
    }

    
if (node->value < parent->value) {    //比父节点小则插入左子树
        if (parent->left != NULL) {        //如果左子树还有节点,则继续
            insert_node(parent->left, node);
        }

        
else
        
{                                //否则直接插入
            parent->left = node;
            
return;
        }

    }

    
else{
        
if (parent->right != NULL) {
            insert_node(parent
->right, node);
        }

        
else
        
{
            parent
->right = node;
            
return;
        }

    }

}

//分配节点空间
int  new_node(TreeNode **node)
{
    
*node=(TreeNode*)malloc(sizeof(TreeNode));
    
if (*node == NULL) {
        
return -1;
    }

    (
*node)->left=(*node)->right = NULL;
    (
*node)->value = 0;
    
return 0;
}

//创建二叉树
void create_tree(TreeNode **head)
{
    TreeNode 
*p=NULL;
    
int value;
    
int ret;
    TreeNode 
*node= NULL;
    
    ret 
= new_node(&node);
    
if ( ret == -1{
        cout 
<< "new_node error" << endl;
        
return;
    }

    
//指向头节点
    p=node;
    
*head=p;
    cin 
>> value;
    node
->value = value;
    
//插入其它节点,以-1为结束标志
    while (1
    
{
        cin 
>> value;
        
if (value == -1)    break;
        ret 
= new_node(&node);
        
if ( ret == -1{
            cout 
<< "new_node error" << endl;
            
return;
        }

        node
->value = value;
        insert_node(p,node);
    }

}


//输出节点
void print(TreeNode *t)
{
    cout 
<< t->value << " ";
}


void del_node(TreeNode *current)
{
    free(current);
    current 
= NULL;
}


void preorder(TreeNode *t, void (*pred)(TreeNode *))
{
    
if (t) {
        pred(t);
        preorder(t
->left, pred);
        preorder(t
->right, pred);
    }

}


void inorder(TreeNode *t, void (*pred)(TreeNode *))
{
    
if (t) {
        inorder(t
->left, pred);
        pred(t);
        inorder(t
->right, pred);
    }

}


void postorder(TreeNode *t, void (*pred)(TreeNode *))
{
    
if (t) {
        postorder(t
->left, pred);
        postorder(t
->right, pred);
        pred(t);
    }

}

void hierarchy(TreeNode *t, void (*pred)(TreeNode *))
{
    queue
<TreeNode *> que;
    TreeNode 
*pTmp = NULL;
    que.push(t);

    
while (!que.empty()) {
        pTmp 
= que.front();
        
if (pTmp->left != NULL) {
            que.push(pTmp
->left);
        }

        
if (pTmp->right != NULL) {
            que.push(pTmp
->right);
        }

        pred(pTmp);
        que.pop();        
    }

}


void visit(TreeNode *t, void (*pred1)(TreeNode *), void(*pred)(TreeNode *void (*)(TreeNode *)))
{
    
if (t) {
        pred(t, pred1);
    }

}

void clear(TreeNode **head)
{
    
//后序遍历清空
    visit(*head, del_node, postorder);
    
*head = NULL;
}

void main(void)
{
    TreeNode 
*head=NULL;
    
//空头节点
    cout << "建立二叉树,节点数据为整型,以-1为输入结束" <<endl;
    create_tree(
&head);
    
    
//前序遍历
    cout << "前序遍历" << endl;
    visit(head, print, preorder);
    cout 
<< endl;

    cout 
<< "中序遍历" << endl;
    visit(head, print, inorder);
    cout 
<< endl;

    cout 
<< "后序遍历" << endl;
    visit(head, print, postorder);
    cout 
<< endl;

    cout 
<< "层次遍历" << endl;
    visit(head, print,hierarchy);
    cout 
<< endl;

    cout 
<< "清空二叉树" << endl;
    clear(
&head);
    visit(head, print, inorder);
    cout 
<< endl;
    
    getchar();
}

修正clear函数

void clear(TreeNode *&t)
{
 //后序遍历清空
// visit(head, del_node, postorder);
 if (t != NULL) {
  clear(t->left);
  clear(t->right);
  free(t);
  t = NULL;
 }
}

测试

建立二叉树,节点数据为整型,以-1为输入结束
5
3
8
6
1
-1
前序遍历
5 3 1 8 6
中序遍历
1 3 5 6 8
后序遍历
1 3 6 8 5
层次遍历
5 3 8 1 6
清空二叉树

 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值