查找树(二叉树)的构建以及分层遍历

本文介绍了如何构建二叉查找树,并通过递归实现先序、后序和层次遍历。代码示例展示了如何插入数据、顺序输出树内容以及使用栈和队列进行层次遍历。
摘要由CSDN通过智能技术生成

代码均通过vs2008编译运行

头文件代码:

#include <iostream>
#include <stack>//包含stack和queue,为了方便遍历数据存储
#include <queue>
struct BTree//定义查找树的结构
{
    int m_data;
    struct BTree* m_pLeft;
    struct BTree* m_pRight;
};

struct BTree* insert(struct BTree* root,int& data)//查找树的生成,采用递归操作
{
    if (root==NULL)
    {
        root = (struct BTree*)malloc( sizeof(struct BTree) );
        root->m_data=data;
        root->m_pLeft=NULL;
        root->m_pRight=NULL;
    }
    else
    {
        if (root->m_data>data)
        {
            root->m_pRight=insert(root->m_pRight,data);
        }
        else
        {
            root->m_pLeft=insert(root->m_pLeft,data);
        }
    }
    return root;
}

void show_tree(struct BTree* root)//输出树的内容,顺序输出
{
    /* recursion */
    if (root->m_pLeft!=NULL||root->m_pRight!=NULL)
    {
        if (root->m_pLeft!=NULL)
        {
            show_tree(root->m_pLeft);
        }
        if (root->m_pRight!=NULL)
        {
            show_tree(root->m_pRight);
        }
    }

    /* backtracking */
    printf("%d\t",root->m_data);
    return;
}

std::stack<int> range_tree(struct BTree* root,std::stack<int>& int_stack)//在栈中存储树的数据,满足LIFO输出
{
    if (root->m_pLeft!=NULL||root->m_pRight!=NULL)
    {
        if (root->m_pLeft!=NULL)
        {
            int_stack=range_tree(root->m_pLeft,int_stack);
        }
        if (root->m_pRight!=NULL)
        {
            int_stack=range_tree(root->m_pRight,int_stack);
        }
    }

    /* backtracking */
    int_stack.push(root->m_data);
    return int_stack;

}

std::queue<int> queue_tree(struct BTree* root,std::queue<int>& int_queue)//在队列中存储树的数据,满足FIFO
{
    if (root->m_pLeft!=NULL||root->m_pRight!=NULL)
    {
        if (root->m_pLeft!=NULL)
        {
            int_queue=queue_tree(root->m_pLeft,int_queue);
        }
        if (root->m_pRight!=NULL)
        {
            int_queue=queue_tree(root->m_pRight,int_queue);
        }
    }

    /* backtracking */
    int_queue.push(root->m_data);
    return int_queue;

}

 

 

主文件:

#include "tree.h"

int main(void)
{
    std::stack<int> int_value;
    std::queue<int> int_queue;
    struct BTree* number={0};//初始化
    int i=0;
    while (std::cin>>i)
    {
        number=insert(number,i);
    }
    show_tree(number);
    std::cout<<std::endl;

    int_value=range_tree(number,int_value);
    std::stack<int>::size_type stack_cap = int_value.size();
    for (std::stack<int>::size_type i=0;i!=stack_cap;++i)
    {
        std::cout<<int_value.top()<<"\t";
        if (int_value.size()!=0)
        {
            int_value.pop();//注意要出栈
        }
        else break;
    }
    std::cout<<std::endl;

    int_queue=queue_tree(number,int_queue);
    std::queue<int>::size_type queue_cap = int_queue.size();
    for (std::queue<int>::size_type iter=0;iter!=queue_cap;++iter)
    {
        std::cout<<int_queue.front()<<"\t";
        int_queue.pop();//注意要出队
       
    }
    std::cout<<std::endl;
    system("pause");
    return NULL;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值