不用堆栈实现树的先序遍历

通常实现树的先序遍历时,我们都需要一个栈来记录位置信息,如果一颗二叉树当中本来就保存了指向父亲的节点,那么我们可以不用堆栈来实现先序遍历。

#include<iostream>
using namespace std;
class node
{
public:
    char value;
    node *parent,*left,*right;
    node(char v):parent(0),left(0),right(0)
    {
        value=v;
    }
};
void first(node *r)
{
    if(r!=NULL)
    {
        cout<<r->value<<endl;
        first(r->left);
        first(r->right);
    }
}
void fun(node *r)
{
    node *p=r;
    node *q;
    bool xunhuan=true;

    while(xunhuan)
    {
        if(p)
        {
            cout<<p->value<<endl;
            if(p->left!=NULL)// 往左走
            {
                p=p->left;
            }
            else
            {
                if(p->right!=NULL)
                {
                    p=p->right;
                }
                else
                {
                    bool flag=true;
                    while(true)
                    {
                        while(p->parent!=NULL&&p->parent->right==p)
                            p=p->parent;
                        if(p->parent==NULL)
                        {
                            xunhuan=false;
                            break;
                        }

                        p=p->parent;
                        while(p->parent==NULL||p==p->parent->left)
                        {
                            if(p->right!=NULL)
                            {
                                p=p->right;
                                flag=false;
                                break;
                            }
                        }
                        if(!flag)
                        {
                            flag=true;
                            break;
                        }
                        if(p->parent==NULL)
                        {
                            xunhuan=false;
                            break;
                        }

                    }

                }
            }
        }
    }
}
void main()
{
    node A(‘A‘),B(‘B‘),C(‘C‘),D(‘D‘),E(‘E‘),F(‘F‘);
    A.left=&B;
    A.right=&C;
    B.parent=&A;
    C.parent=&A;
    B.left=&D;
    B.right=&E;
    D.parent=&B;
    E.parent=&B;
    C.left=&F;
    F.parent=&C;
    first(&A);
    cout<<"循环遍历"<<endl;
    fun(&A);

    system("pause");

}

以上代码可以直接运行。

时间: 2025-01-01 23:42:00

不用堆栈实现树的先序遍历的相关文章

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历

表达树就是根据后缀表达式来建立一个二叉树. 这个二叉树的每个叶子节点就是数,真祖先都是操作符. 通过栈来建立的,所以这里也会有很多栈的操作. 树的先序遍历,中序遍历,后序遍历的概念我就不讲了,不会的自行百度,不然也看不懂我的代码. 下面是代码: // // main.cpp // expressionTree // // Created by Alps on 14-7-29. // Copyright (c) 2014年 chen. All rights reserved. // #includ

【编程题目】判断整数序列是不是二元查找树的后序遍历结果,如果是,构建该二元查找树

判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回 true,否则返回 false.例如输入 5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11因此返回 true.如果输入 7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回 false. 做这个题目的时候最开始傻了,想着从前到后根据数字的大小关系判断.后来幡然醒悟,根据后序遍历的特点.序列最后一

树的先序遍历的栈实现

树的先序遍历的栈实现 先把根节点访问了,右子树入栈,去访问左子树. 1 void preorder(tree bt) //先序遍历bt所指的二叉树 2 { 3 tree stack[n]; //栈 4 int top = 0; //栈顶指针 5 tree P; 6 while(bt || top) 7 { 8 while(bt) //非叶结点 9 { 10 cout << bt->data; //访问根 11 stack[++top] = bt->rchild; //右子树压栈 1

微软算法100题09 判断整数序列是不是二元查找树的后序遍历结果

9. 判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false.例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果:8/ \6 10/ \ / \5 7 9 11因此返回true.如果输入7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回false. 思路:如果一个数组为BST的后序遍历结果 则最后一个元素必然为该BST的根节点 因为BST的特性是左子树必然全部小

IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果

问题描述: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树的后序遍历结果: 10/     \6      14/  \    /   \4   8 12    16 因此返回true. 如果输入6, 5, 8, 5, 7 ,则返回false. 分析: 在后续遍历得到的序列中,最后一个元素为树的根结点.根节点元素将数组分为两部分,左边都小于根节点,右边都大

9判断整数序列是不是二元查找树的后序遍历结果

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4252095.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 解题思路: 1.输入一个整型数组a,根据该数组创建二

第9题:判断整数序列是不是二元查找树的后序遍历结果

欢迎转载,转载请务必注明出处:http://blog.csdn.net/alading2009/article/details/44872143 第9题:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 因此返回true. 如果输入7.4.6.5,没有哪棵树的后序遍历的结果是这个序列,因此返回false. 由于二叉查找树的特性(左子树的值小于根节点,右子树的值

6.二元查找树的后序遍历结果

http://zhedahht.blog.163.com/blog/static/25411174200725319627/ 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8       /  \      6    10    / \    / \   5   7   9  11 因此返回true. 如果输入7.4.6.5,没有哪棵树的后序遍历的结

maven之Transitive dependencies(默认树的先序遍历算法处理依赖冲突)

maven之Transitive dependencies(默认树的先序遍历算法处理依赖冲突) One of Maven's major contributions is the way it deals and manages not only direct dependencies, but also transitive ones. 你项目中的依赖,不管是直接依赖还是间接/传递依赖,maven都能很好的管理. The concept of transitivity Dependencies