zoukankan      html  css  js  c++  java
  • 【算法与数据结构】二叉树的 先序 遍历

     

    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;
    }
  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/cuish/p/3687779.html
Copyright © 2011-2022 走看看