二叉树遍历

二叉树的创建

二叉树的表示

二叉树可以用结构体的方式表示,也可以用类的方式表示。当然这两种表示方式都离不开指针
1.结构体表示

//binary tree
struct tree
{
    int val;
    tree *left;
    tree *right;
    tree(int x):val(x),left(NULL),right(NULL){}
};

2.类表示
在C++中结构体和类几乎没有什么区别,只是成员的访问属性上,类默认是private,而结构体默认是public

二叉树的创建

下面创建一个树,并且返回头指针

//create tree
/*
this is the tree we will create:
                1
               / \
              /   \
             2     3
                  / 
                 /   
                4
                 \
                  \
                   5

preorder    1 2 3 4 5
inorder     2 1 4 5 3
postorder   2 5 4 3 1
*/
tree * create()
{
    tree *head = new tree(1);
    head->left = new tree(2);
    head->right = new tree(3);
    head->right->left = new tree(4);
    head->right->left->right = new tree(5);
    return head;
}

二叉树的遍历

递归遍历

递归遍历比较简单,也是最常用的方式

先序遍历

//preorder tranversal
void PreorderTraversing(tree *node)
{
    if(node==NULL)
    {
        return ;
    }
    //to do something with node value
    cout<<node->val<<endl;

    traversing(node->left);
    traversing(node->right);  
}

中序遍历

//inorder tranversal
void InorderTraversing(tree *node)
{
    if(node==NULL)
    {
        return ;
    }
    traversing(node->left);

    //to do something with node value
    cout<<node->val<<endl;

    traversing(node->right);  
}

后序遍历

//postorder tranversal
void PostorderTraversing(tree *node)
{
    if(node==NULL)
    {
        return ;
    }
    traversing(node->left);
    traversing(node->right);  

    //to do something with node value
    cout<<node->val<<endl;
}

循环遍历

循环遍历这里主要用到了STL标准库的栈的数据结构

先序遍历

//preorder tranversal using stack
void PreorderTraversing(tree *head)
{
    stack<tree*> treestack;
    tree *node = head;
    while(node||!treestack.empty())
    {
        treestack.push(node);

        //to do something with node value
        cout<<node->val<<endl;

        node=node->left;
        while(!node&&!treestack.empty())
        {
            node=treestack.top();
            treestack.pop();
            node=node->right;
        }
    }
}

中序遍历

//Inorder tranversal using stack
void InorderTraversing(tree *head)
{
    stack<tree*> treestack;
    tree *node = head;
    while(node||!treestack.empty())
    {
        treestack.push(node);
        node=node->left;
        while(!node&&!treestack.empty())
        {
            node=treestack.top();
            treestack.pop();

            //to do something with node value
            cout<<node->val<<endl;

            node=node->right;
        }
    }
}

后序遍历

//Postorder tranversal using stack
void PostorderTraversing(tree *head)
{
    stack<tree*> treestack;
    tree *node = head,*prenode=NULL;
    if(node==NULL)
    {
        return ;
    }
    treestack.push(node);
    while(!treestack.empty())
    {
        node=treestack.top();

        if((node->left==NULL && node->right==NULL)||(node->left==prenode || node->right==prenode))
        {
            //to do something with node value
            cout<<node->val<<endl;

            prenode=node;
            treestack.pop();
        }
        else
        {
            if(node->right!=NULL)
            {
                treestack.push(node->right);
            }
            if(node->left!=NULL)
            {
                treestack.push(node->left);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值