• 【算法与数据结构】二叉树的 先序 遍历


     

    1、二叉树的构造

        二叉树的构造采用递归方式

    //二叉链表方式存储的二叉树结构
    typedef struct _tagBinaryTreeNode
    {
        unsigned char  value;
        struct  _tagBinaryTreeNode* lchind; 
        struct  _tagBinaryTreeNode* rchild;
    }BinaryTreeNode, *PBinaryTreeNode;

     

    //先序  递归方式初始化二叉树 
    void InitBinaryTree(PBinaryTreeNode& pRoot)
    {
        cout << "请输入节点的值,#表示空:";
        unsigned char temp;
        cin >> temp;
        if (temp == '#')
        {
            pRoot = NULL;
        }
        else
        {
            if (NULL != (pRoot = new BinaryTreeNode()))
            {
                pRoot->value = temp;
                InitBinaryTree(pRoot->lchind);
                InitBinaryTree(pRoot->rchild);
            }
            else
            {
                exit(-1);
            }
        }
    }

     

     

    依次输入如下:

     

    构造的二叉树如下:

     

     

    -------------------------------------------------------------------------------------------

     

      

    2、二叉树的先序遍历

    访问二叉树节点的代码

    //访问二叉树节点
    void Visit(PBinaryTreeNode pNode)
    {
        cout<<"节点值为:"<<pNode->value<<endl;
    }

     

    2.1 递归方式

         先访问根节点,然后访问左子树,再访问右子树

    //递归方式先序遍历二叉树
    void PreTraverse(PBinaryTreeNode pNode)
    {
        if (NULL == pNode)
        {
            return;
        }
        else
        {
            Visit(pNode);
        }
        PreTraverse(pNode->lchind);
        PreTraverse(pNode->rchild);
    }

     

     

    运行结果:

     

     

    2.2 非递归方式

        非递归方式先序遍历二叉树的思想:


    //非递归方式先序遍历的思想:
    首先将根节点入栈,如果栈为空退出
    取栈顶元素,如果栈顶元素a为NULL,则栈顶元素a == NULL出栈,
    再将此时的栈顶元素b出栈,然后将元素b的右子树入栈,再次循环此过程;

    /*****************************************************************
    //非递归方式先序遍历二叉树,第二个参数无意义,重载只表示非递归
    
    //非递归方式先序遍历的思想:
    首先将根节点入栈,如果栈为空退出
    取栈顶元素,如果栈顶元素a为NULL,则栈顶元素a == NULL出栈,
    再将此时的栈顶元素b出栈,然后将元素b的右子树入栈,再次循环此过程; 
    
    ******************************************************************/
    void PreTraverse(PBinaryTreeNode pNode, int nonRecurrence)
    {
        //存放元素的栈
        stack<PBinaryTreeNode> stBT;
    
        //将栈顶元素入栈
        stBT.push(pNode);
    
        while(! stBT.empty())
        {
            PBinaryTreeNode topPNode = stBT.top();
            //栈顶元素不为NULL,访问此元素,并将其左子树入栈
            if (NULL != topPNode)
            {
                Visit(topPNode);
                stBT.push(topPNode->lchind);
            }
    
            //栈顶元素a为NULL,此元素a出栈,然后再将栈顶元素b出栈
            //将元素b右子树入栈
            else
            {
                //将栈顶的为NULL的元素出栈
                stBT.pop();
                if (! stBT.empty())
                {
                    //取此时的栈顶元素,将其出栈并将其右子树入栈
                    topPNode = stBT.top();
                    stBT.pop();
                    stBT.push(topPNode->rchild);
                }
            }
        }
    }

     

     

    运行结果如下:

     

      最后贴出man函数

    int _tmain(int argc, _TCHAR* argv[])
    {
        cout << "
     ------先序构造二叉树,注意叶子节点的左右子树为空,输入#表示NULL--------
    ";
        PBinaryTreeNode pRoot = NULL;
        InitBinaryTree(pRoot);
        cout << "
     ----------先序构造二叉树完毕 --------------
    
    ";
    
        cout << "
     -----------开始递归先序遍历二叉树 ------------
    ";
        PreTraverse(pRoot);
        cout << " --------------结束 递归先序遍历二叉树 ------------
    ";
    
        cout << "
     ----------开始 非递归 遍历二叉树--------------
    ";
        PreTraverse(pRoot, 0);  
        cout << " --------------结束 非递归 遍历二叉树--------------
    ";
    
        return 0;
    }
  • 相关阅读:
    djangorestframework的源码认证流程
    centos7 docker更换源地址(阿里云)
    vue 递归 无限极
    Linux文件属性及如何改变文件属性和权限
    centos7 安装docker
    centos7 mysql5.7 忘记密码
    git push 单个文件时超过100M报错,解决方案
    python中的依赖包--导出与安装
    18-----cmdb需求规划以及表结构设计
    17-----vue前端权限管理
  • 原文地址:https://www.cnblogs.com/cuish/p/3687779.html
Copyright © 2020-2023  润新知