当前位置: 首页 > news >正文

成都网站建设推广在全媒体广告投放平台

成都网站建设推广在,全媒体广告投放平台,广州市官网网站建设公司,怎么在国际网站做推广非递归遍历二叉树 前序中序后序 接下来我们在研究如何使用循环实现遍历二叉树时,以下面的二叉树为例: 在下文的讲解中,不对如何构建这颗二叉树做讲解,直接给出代码,如果有不懂的地方欢迎私信我。 文章中的完整源代码链…

非递归遍历二叉树

  • 前序
  • 中序
  • 后序

接下来我们在研究如何使用循环实现遍历二叉树时,以下面的二叉树为例:
在这里插入图片描述
在下文的讲解中,不对如何构建这颗二叉树做讲解,直接给出代码,如果有不懂的地方欢迎私信我。

文章中的完整源代码链接在结尾处。

前序

先来讲解前序。
前序的遍历顺序为:根-左-右,所以以上面的这棵树为例,前序遍历的结果就应该为:3 1 0 2 4 5
我们要遍历这颗树,不适用递归的话,就只能使用循环的方式来了。

思路讲解:
根据前序的遍历顺序我们不难发现,我们首先要先将根节点和左子树遍历完才能遍历右子树,所以我们可以先循环遍历到这颗树的最左结点,同时将结点的值存放在vector中。如下图所示:
在这里插入图片描述
接下来我们就要考虑的是,如何遍历右子树的问题。
其实也不难,我们只需要使用一个栈,在vector存在结点的值的同时,将结点也存放在栈结构中即可,即在上图的遍历完成后我们还能得到一个下图所示的栈:
在这里插入图片描述
在上图中我们已经完成了0结点和0结点的左子树的遍历,因为0结点的左子树为空所以本次循环结束,接下来我们只需要取栈顶元素,即0结点,让栈顶元素的右子树按照同样的方式进行遍历即可。

因为0的右子树也为空,所以下次循环直接结束,再取栈顶元素的时候,因为0已经被取走了,再取就是1结点了,1结点的右子树不为空,所以2入vector和栈。
上诉过程如下图所示:
在这里插入图片描述
然后就是以同样的方式去遍历整颗树。
代码如下:

//前序遍历
vector<int> preorderTraversal(TreeNode* root) 
{//非递归,借助栈来实现//分为两大的问题,一,左路结点, 二,左路节点的右子树stack<TreeNode*> st;vector<int> arr;TreeNode* cur = root;while (cur || !st.empty()){//1.先访问左路结点while (cur){st.push(cur);arr.push_back(cur->val);cur = cur->left;//向左走,先把左路结点全部放到栈}//2.开始处理最左结点的右子树问题TreeNode* top = st.top();st.pop();//访问每个左路结点的右子树就是上述过程的子问题,把左节点的第一个右结点//看成一个树的根节点。cur = top->right;}return arr;
}

测试结果:
在这里插入图片描述

中序

中序的遍历和前序本质上没有太大的区别,一定要在理解前序之后再来看中序。
这里先直接给出代码,再给代码进行解释:

//中序遍历
vector<int> inorderTraversal(TreeNode* root) {//思路跟前序的非递归相似stack<TreeNode*> st;vector<int> arr;TreeNode* cur = root;while (cur || !st.empty()){while (cur){st.push(cur);cur = cur->left;}TreeNode* top = st.top();st.pop();arr.push_back(top->val);cur = top->right;//一个结点从栈中出来就意味着,它和它的左子树访问完了}return arr;
}

因为中序遍历的顺序是:左-根-右。
所以在遍历到最左结点的时候,不应该直接入vector中,而是在取栈顶元素的时候,将其值入到vector中去。

认真观察我们可以发现一点:一个结点如果出栈的话,就代表这个结点的左子树肯定是遍历完了的!!

后序

后序就需要先遍历完左右子树再去处理根节点了。
讲解以注释的形式给出了,按照代码的思路去走一遍才能更好的理解。

//后序遍历
vector<int> postorderTraversal(TreeNode* root) {//思路跟前序的非递归相似stack<TreeNode*> st;vector<int> arr;TreeNode* cur = root;TreeNode* prev = nullptr;while (cur || !st.empty()){while (cur){st.push(cur);cur = cur->left;}TreeNode* top = st.top();if (top->right == nullptr || top->right == prev){//满足第一个条件的时候,处理的就是左结点//满足第二个条件的时候,处理的就是根结点,,在满足第二个条件的时候,就说明左右子树都处理完了arr.push_back(top->val);prev = top;st.pop();}elsecur = top->right;//开始遍历右子树}return arr;
}

测试结果:
在这里插入图片描述

点此处->源代码链接

http://www.khdw.cn/news/69158.html

相关文章:

  • 台州有哪些做网站的公司外贸营销型网站建设公司
  • 无锡阿凡达建设成都百度提升优化
  • 常德做网站多少钱怎么做网站优化
  • 凡科做的网站为什么打不开互动营销案例都有哪些
  • 怎么做跳转网站首页如何免费做视频二维码永久
  • 做外贸选取哪个网站竞价推广返点开户
  • 怎么做论坛社区网站杭州网站提升排名
  • 湛江专业建站推广机构小程序如何推广运营
  • 后台模板链接前台网站百度网址大全怎么设为主页
  • 大连建设网官方网站怎么开发自己的小程序
  • 做网站怎么选空间sku电商是什么意思
  • 青岛做网站的公司排名小程序开发公司哪里强
  • 网站开发人员工具种类百度收录情况
  • seo搜索优化 指数网站搜索优化
  • 营销型网站单页石家庄seo推广优化
  • doku做网站营销和运营的区别是什么
  • 怎么做电商运营的基本步骤seo优化工作
  • 用word做网站首页资源平台
  • 做招聘网站要多久深圳网站建设公司排名
  • 锦屏县城乡和建设局网站微信5000人接推广费用
  • 古城区建设局网站外链网盘源码
  • 软件开发工具的主要分类方法武汉seo网站排名
  • 男孩子怎么做网站赚钱武汉企业seo推广
  • 项目管理工具南昌seo排名收费
  • 有没有什么网站免费做名片seo全称
  • 网络营销推广方法研究石家庄seo代理商
  • 做网站都需要准备什么软件百度网络营销的概念
  • 如何购买域名和备案拼多多标题关键词优化方法
  • 公司网站可以自己做吗济南seo关键词排名工具
  • html5响应式网站建设平台贵阳seo网站管理