二叉树的建立(链式存储,遍历,深度,节点数,路径)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chu_jian86a/article/details/50405402

数据结构编程练习(六)

题目:

1)能够调用递归函数读取相应的数据建立二叉树,相应数据格式自行设计; 

2)实现先序、中序、后序遍历二叉树

3)求取二叉树中的所有结点数

4)求取二叉树的深度

5)查找某节点是否存在并输出路径



输入如图所示二叉树的方式为依次输入:1,2,-1,4,-1,-1,3,5,-1,-1,6,-1,-1

代码实现:

#include "iostream"
#include "stack"
using namespace std;
struct tree
{
    int data;
    tree *lchild,*rchild;
};
class BiTree
{
public:
    BiTree();
    ~BiTree();
    int preorder(tree *node);
    int inorder(tree *node);
    int postorder(tree *node);
    int visit(tree *node);
    int create_BT(tree *&node);
    int calculate_node(tree *node,int &n);
    int depth(tree *node);
    int path(tree *node, int x);
    int max(int a,int b);
    void Release(tree *&node);
    stack <int> Path;
    bool flag;//是否查找到节点标志 
//private:
    tree *root;
};
BiTree::BiTree()
{
    root=new tree;
    root->lchild=NULL;
    root->rchild=NULL;
}
BiTree::~BiTree()
{
    Release(root);
}
void BiTree::Release(tree *&node)
{
    if (node!=NULL)
    {
        cout<<node->data<<"已被删除"<<endl;
        Release(node->lchild);   //释放左子树
        Release(node->rchild);   //释放右子树
        delete node;
    }  
}
//二叉树的建立(链式存储)  
int BiTree::create_BT(tree *&node)
{
    int n;
    cin>>n;
    if(n<0)
    {
        node=NULL;
        return 0;
    }
    else
    {
        node=new tree;
        node->data=n; 
        create_BT(node->lchild);
        create_BT(node->rchild);
    }
}
//访问结点 
int BiTree::visit(tree *node)
{
    cout<<node->data<<" ";
    return 0;
}
//先序遍历
int BiTree::preorder(tree *node)
{
    if(node!=NULL)
    {
        visit(node);
        preorder(node->lchild);
        preorder(node->rchild);
    }
    return 0;
} 
//中序遍历
int BiTree::inorder(tree *node)
{
    if(node!=NULL)
    {
        inorder(node->lchild);
        visit(node);
        inorder(node->rchild);
    }
    return 0;
} 
//后序遍历
int BiTree::postorder(tree *node)
{
    if(node!=NULL)
    {
        postorder(node->lchild);
        postorder(node->rchild);
        visit(node);
    }
    return 0;
} 
//计算二叉树的结点数(先序遍历法) 
int BiTree::calculate_node(tree *node,int &n)
{
    if(node!=NULL)
    {
        n++;
        calculate_node(node->lchild,n);
        calculate_node(node->rchild,n);
    }
    return 0;
} 
//求二叉树的深度
int BiTree::depth(tree *node) 
{
    if(node==NULL)
        return 0;
    else
        return max(depth(node->lchild),depth(node->rchild))+1;
}
//计算到某节点的路径
int BiTree::path(tree *node, int x)
{
    if(node!=NULL)
    {
        if(node->data==x)
        {
            flag=true; 
            cout<<"从根节点到"<<x<<"节点的路径为:" <<endl;
            while(!Path.empty())
            {
                cout<<x<<" ";
                x=Path.top();
                Path.pop();
            }
            cout<<x<<endl;
            return 1;
        }
        else
        {
            Path.push(node->data);
            path(node->lchild,x);
            path(node->rchild,x);    
            Path.pop();
        }
    }
    return 0;
} 
//取较大值 
int BiTree::max(int a,int b)
{
    return a>b?a:b;
}
int main()
{
    BiTree obj1;
    obj1.flag=false;
    int n=0;
    obj1.create_BT(obj1.root);
    cout<<"二叉树的先序遍历:"; 
    obj1.preorder(obj1.root);
    cout<<endl;
    cout<<"二叉树的中序遍历:";
    obj1.inorder(obj1.root);
    cout<<endl;
    cout<<"二叉树的后序遍历:";
    obj1.postorder(obj1.root);
    cout<<endl;
    obj1.calculate_node(obj1.root,n);
    cout<<"结点数为:"<<n<<endl;
    n=obj1.depth(obj1.root);
    cout<<"深度为:"<<n<<endl; 
    int x;
    cout<<"请输入要查询的节点值:";
    cin>>x; 
    obj1.path(obj1.root,x);
    if(!obj1.flag)
        cout<<"未找到该节点"<<endl;
    return 0;
}







展开阅读全文

没有更多推荐了,返回首页