我是靠谱客的博主 淡淡黑夜,最近开发中收集的这篇文章主要介绍实现二叉树的各种遍历算法_算法之——二叉树的遍历,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

二叉树的三种遍历方式

本人大一学生,笔记献上,数据结构与算法的初学者可以参考哦!

(好像不用说图片侵删吧,哈哈哈哈)

前言

人为什么难做选择?

选择意味着放弃

你选择一方,也就意味着放弃了另一方。摆在你面前的选择项越接近,你的选择就会越困难,因为放弃其中任何一个选择项都不容易。如果摆在你面前的选择项对比明显,那么选择起来就会轻松许多,大家几乎都会毫不犹豫的选择“好”的选择项,放弃掉“差”的选择项。

选择永远都不是完美的

选择永远都不可能十全十美,只可能满足尽量多的侧重点。选择的时候想满足越多的侧重点,可能就会越难做出选择。所以在选择上不要过于追求完美。

警惕逃避性选择——不知道自己要去哪儿,还要选择离开。

有一种选择是对现状不满,想逃离这种现状,但是却不知道去哪里。举个例子,可能目前的公司有各种问题,比如开发流程不规范等,如果因为这些问题离开,可能就会从一个坑跳到另外一个更大的坑。当决定离开的时候,一定是自己有明确的目标,很清楚自己想要什么。


二叉树的定义

二叉树要么为空,要么由根节点(root),左子树(left subtree)和右子树(right subtree)组成,而且左子树和右子树分别是一棵二叉树。


二叉树的遍历

  • 先序遍历

PreOrder(T)=Root(T)+PreOrder(left subT)+PreOrder(right subT)

  • 中序遍历

InOrder(T)=InOrder(left subT)+Root(T)+InOrder(right subT)

  • 后序遍历

PostOrder(T)=PostOrder(left subT)+PostOrder(Right subT)+Root(T)

670d04a1994d1413adf063fbf508642e.png

struct Bitree
{
    int data;
    Bitree Lchild;
    Bitree Rchild;
};

先序遍历

  1. 递归实现
void PreOrderTraverse(BiTree tree)
{
    if (tree == NULL)
        return;
    cout << tree->data;
    PreOrderTraverse(tree->lchild);
    PreOrderTraverse(tree->rchild);
}
  1. 迭代实现
void PreOrder(BiTree Root)
{
    stack <BiTree> s;
    if (root) //如果根节点不为空
        s.push(root); //则令根节点入栈
    while (!s.empty()) //在栈变空之前反复循环
    { 
        root = s.pop(); 
        cout << root->data; //弹出并访问当前节点
        //下面左右孩子的顺序不能颠倒
        //必须先让右孩子先入栈,再让左孩子入栈。
        if (root->RChild)
            s.push(root->RChild); //右孩子先入后出
        if (root->LChild)
            s.push(root->LChild); //左孩子后入先出
    }
}

我们通过一个实例来了解一下该迭代版本是如何工作的 :

55d4eea86461274734781494b95d1ec4.png

中序遍历

  1. 递归实现
void InOrderTraverse(BiTree tree)
{
    if (!tree)
        return;
    InOrderTraverse(tree->lchild);
    cout << tree->data;
    IndOrderTraverse(tree->rchild);
}
  1. 迭代实现
void InOrderTraverse(BiTree root)
{
   Stack<BiTree> S; //辅助栈
   while (true)
      if (root) 
      {
         S.push (root); //根节点进栈
         root = root->LChild; //深入遍历左子树
      } 
      else if (!S.empty()) 
      {
         root = S.pop(); //尚未访问的最低祖先节点退栈
         cout << root->data; //访问该祖先节点
         root = root->RChild; //遍历祖先的右子树
      } 
      else
         break; //遍历完成
}

后序遍历

  1. 递归实现
void PostOrderTraverse(BiTree tree)
{
    if (!tree)
        return;
    InOrderTraverse(tree->Lchild);
    IndOrderTraverse(tree->Rchild);
    cout << tree->data;
}
  1. 迭代实现
#define A !cur->Lchild && !cur->Rchild
//如果P不存在左孩子和右孩子,则可以直接访问它;
#define B pre==cur->Lchild || pre==cur->Rchild
//P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了;
void PostOrder(BiTree Root)
{
    if (!Root)
        return;
    stack <BiTree> s;//辅助栈
    BiTree cur=Root,pre=NULL;
    s.push(Root);//根节点进栈
    while (!s.empty())
    {
        cur=s.top();
        if (A || B)
        {
            cout << cur->data;
            s.pop();
            pre=cur;
        }
        else
        {
            if (cur->Rchild)
                s.push(cur->Rchild);
            if (cur->Lchild)
                s.push(cur->Lchild);
        }
    }
}

END

码字不易,点个赞再走呗!

另外,感兴趣的读者也可以参看我的以下文章:

tonyl:微积分,离散,计算机笔记入口​zhuanlan.zhihu.com
7fb95935a57a525ed035a8c566d4cb4b.png

最后

以上就是淡淡黑夜为你收集整理的实现二叉树的各种遍历算法_算法之——二叉树的遍历的全部内容,希望文章能够帮你解决实现二叉树的各种遍历算法_算法之——二叉树的遍历所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部