热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

二叉树的遍历递归非递归

二叉树如上图所示。一、递归遍历二、非递归遍历要借助栈或队列初始化把根节点压栈,访问根节点并弹出,然后依次将右节点、左节点入栈,直到栈为空。思路:回溯。访问根节点的左孩子,访问左孩子

技术分享图片

二叉树如上图所示。

一、递归遍历

#include 
#include 
using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x): val(x), left(NULL), right(NULL) {}
};

// 先序遍历,递归
// [1] [2] [4] [5] [6] [7] [3]
void preorder1(TreeNode* root) {
    if(!root)   return;
    cout <<[ <val <<"] ";
    preorder1(root->left);
    preorder1(root->right);
}

// 中序遍历,递归
// [4] [2] [6] [5] [7] [1] [3]
void inorder1(TreeNode* root) {
    if(!root)   return;
    inorder1(root->left);
    cout <<[ <val <<"] ";
    inorder1(root->right);
}

// 后序遍历,递归
// [4] [6] [7] [5] [2] [3] [1]
void postorder1(TreeNode* root) {
    if(!root)   return;
    postorder1(root->left);
    postorder1(root->right);
    cout <<[ <val <<"] ";
}

 二、非递归遍历

要借助栈或队列

// 先序遍历,非递归
void preorder2(TreeNode* root) {
    if(!root)   return;
    stack s;
    s.push(root);
    while(!s.empty()) {
        TreeNode* node = s.top();
        cout <<[ <val <<"] ";
        s.pop();
        if(node->right)  s.push(node->right);
        if(node->left)  s.push(node->left);
    }
}

初始化把根节点压栈,访问根节点并弹出,然后依次将右节点、左节点入栈,直到栈为空。

// 先序遍历,非递归
void preorder3(TreeNode* root) {
   stack s;
    while(root != NULL || !s.empty()) {
        if(root != NULL) {
            s.push(root);
            cout <<[ <val <<"] ";
            root = root->left;
        }
        else {
            root = s.top();
            s.pop();
            root = root->right;
        }
    }
}

思路:回溯。访问根节点的左孩子,访问左孩子的左孩子,直到左孩子为空,这个过程中把所有访问过的节点压栈,当左孩子为空,pop该节点,访问该节点的右孩子。空间复杂度O(logN) 和树的深度有关。时间复杂度O(N),所有节点都访问了一遍。

二叉树的遍历-递归-非递归


推荐阅读
  • ProblemDescription 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵 但是对于学校财务处的工作人员来说,这一天则是 ... [详细]
  • 原文网址:转载请注明出处:http:blog.csdn.netguolin_blogarticledetails17357967不知不觉中,带你一步步深入了解View系列的文章已经 ... [详细]
  • 哈希表两个数组的交集
    解法:由于同一个list中可能存在重复元素,所以考虑采用计数的方式解决问题,具体思路如下:首先构建一个dict来记录list中的元素个数,称为count_dict;count_di ... [详细]
  • 函数重载定义:在相同的作用域中具有相同的函数名而函数形参列表(参数类型、参数个数、参数顺序)不同的两个函数,称之为函数重载。注意:函数返回值类型并不是重载的条件。函数重载优点:可以 ... [详细]
  • 04-树5.FileTransfer(25)时间限制150ms内存限制65536kB代码长度限制8000B判题程序Standard作者CHEN,YueWehaveanetworko ... [详细]
  • 队列:先进先出。一、构造函数queueque;queue(constqueue&que);二、赋值操作queue&operator(constqueue&que);三、数据存 ... [详细]
  • Gluon parameters 和 Blocks 命名
    API:gluon中每个Parameters或者Block都有前缀prefix,Parameters的名字由用户指定,Block的名字可以由用户指定或自动生成。from__futu ... [详细]
  • Android Application的作用
    1.什么是Application?(WhatisApplication)Application和Actovotu,Service一样是android框架的一个系统组件,当andro ... [详细]
  • 1、html特殊字符的显示   我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上 ... [详细]
  • ?? 1  通过process的方式播放视频 T22VideoPlayer.pro HEADERS + ... [详细]
  • 在浏览器中浏览项目目录结构
    效果如下,参考:https:gitee.comoschinaGitC ... [详细]
  • 部署(1.使用Xshell连接云服务器)
    0.软件硬件:1.腾讯云云服务器2.Ubuntu18系统3.Win7系统4.Xshell、Navicat、FileZilla1.同步数据库1.使用Xshell连接云服务器1.打开X ... [详细]
  • jQuery_AJAX代码:$.ajax({url:,async:true, data:(JSON),successerror});参数options类型:Object可选。AJ ... [详细]
  • 1.java,.net,php,我改学哪个,用哪个?他们都能写出,高性能,可扩展,可服用,安全的程序。政府的软件本@文来源gao($daima.com搞@代@#码(网5搞gaoda ... [详细]
  • Qt获得网页源码
    1.工程中添加网络模块打开你的.pro文件插入以下代码QT+ network2.添加代码CodeQStringNetWork::getWebSource(QUrlurl){QNe ... [详细]
author-avatar
濮阳土著_480
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有