zoukankan      html  css  js  c++  java
  • 二叉树的遍历

    递归遍历

    前序

    //前序遍历
    void PreOrder(BTnode *pnode)
    {
        if (pnode)
        {
            visit(pnode);
            PreOrder(bnode->left);
            PreOrder(bnode->right);
        }
    }
    

    中序

    //中序遍历
    void InOrder(BTnode *pnode)
    {
        if (pnode)
        {
            InOrder(pnode->left);
          递归遍历  visit(pnode);
            InOrder(pnode->right);
        }
    }
    

    后序

    //后序遍历
    void PostOrder(BTnode *pnode)
    {
        if (pnode)
        {
            PostOrder(pnode->left);
            PostOrder(pnode->right);
            visit(pnode);
        }
    }
    

    非递归遍历

    前序

    ​ 先访问根节点,再将其入栈,以便之后返回,就这样一直遍历到左子树最下面,然后出栈,进入右子树,继续开始遍历。

    //前序遍历
    void PreOrder1(BTnode *pnode)
    {
        stack<*BTnode> s;
        BTnode *p = pnode;
        while (p || !s.empty())
        {
            while (p)
            {
                visit(p); //先访问根节点,再入栈
                s.push(p);
                p = p->left; //遍历到左子树最下面
            }
            if (!s.empty())
            {
                p = s.top();
                s.pop();
                p = p->right; //进入右子树,开始新的遍历
            }
        }
    }
    void PreOrder2(BTnode *pnode)
    {
        stack<*BTnode> s;
        BTnode *p = pnode;
        while (p || !s.empty())
        {
            if (p)
            {
                visit(p);
                s.push(p);
                p = p->left;
            }
            else
            {
                p = s.top();
                s.pop();
                p = p->right;
            }
        }
    }
    void PreOrder3(BTnode *pnode)
    {
        stack < *BTnod入栈
                    BTnode *p = pnode;
        while (p || !s.empty())
        {
            visit(p);
            if (p->right)
                s.push(p->right);
            if (p->left)
                s.push(p->left);
            else
            {
                p = s.top();
                s.pop();
                p = p->right; //左子树访问完了,访问右子树
            }
        }
    }
    

    中序

    //中序遍历
    void InOrder1(BTnode *pnode)
    {
        stack<*Bnode> s;
        BTnode *p = pnode;
        while (p || !s.empty())
        {
            //先找到左子树的最下边的节点
            while (!p)
            {
                s.push(p); //边遍历边保存根节点到栈中
                p = p->left;
            }
            //p为空时,说明已经到达左子树最下边,这时需要出栈
            if (!s.empty())
            {
                p = s.top();
                visit(p);
                s.pop();
                p = p->right; //进入右子树,开始新的一轮左子树遍历
            }
        }
    }
    vodi InOrder2(BTnode *pnode)
    {
        stack<*BTnode> s;
        BTnode *p = pnode;
        while (p || !s.empty())
        {
            if (p)
            {
                s.push(p);
                p = p->left;
            }
            else
            {
                p = s.top();
                s.pop();
                visit(p);
                p = p->right;
            }
        }
    }
    

    后序

  • 相关阅读:
    Edge浏览器主页被360劫持怎么办 ?
    wpf小技巧——datagrid 不出现 滚动条问题
    c++学习资料
    Mosquitto创建MQTT服务器提示Starting in local only mode的解决办法
    【转】在 Golang 中使用 Cobra 创建 CLI 应用
    【转】Golang的HTTP操作大全
    BigDecimal类中的3个toString方法
    Path is not a working copy directory
    Cannot deserialize instance of `java.lang.String` out of START_OBJECT token
    sqlserver判断字符串是否是纯数字
  • 原文地址:https://www.cnblogs.com/vlyf/p/11745279.html
Copyright © 2011-2022 走看看