C++实现LeetCode(144.二叉树的先序遍历)

 更新时间:2021年07月15日 10:18:49   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(144.二叉树的先序遍历),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 144. Binary Tree Preorder Traversal 二叉树的先序遍历

Given a binary tree, return the preorder traversal of its nodes' values.

Example:

Input: 

[1,null,2,3]

1
\
2
/
3

Output: 

[1,2,3]

Follow up: Recursive solution is trivial, could you do it iteratively?

一般我们提到树的遍历,最常见的有先序遍历,中序遍历,后序遍历和层序遍历,它们用递归实现起来都非常的简单。而题目的要求是不能使用递归求解,于是只能考虑到用非递归的方法,这就要用到stack来辅助运算。由于先序遍历的顺序是"根-左-右", 算法为:

1. 把根节点 push 到栈中

2. 循环检测栈是否为空,若不空,则取出栈顶元素,保存其值,然后看其右子节点是否存在,若存在则 push 到栈中。再看其左子节点,若存在,则 push 到栈中。

参见代码如下:

解法一:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        if (!root) return {};
        vector<int> res;
        stack<TreeNode*> s{{root}};
        while (!s.empty()) {
            TreeNode *t = s.top(); s.pop();
            res.push_back(t->val);
            if (t->right) s.push(t->right);
            if (t->left) s.push(t->left);
        }
        return res;
    }
};

下面这种写法使用了一个辅助结点p,这种写法其实可以看作是一个模版,对应的还有中序和后序的模版写法,形式很统一,方便于记忆。辅助结点p初始化为根结点,while 循环的条件是栈不为空或者辅助结点p不为空,在循环中首先判断如果辅助结点p存在,那么先将p加入栈中,然后将p的结点值加入结果 res 中,此时p指向其左子结点。否则如果p不存在的话,表明没有左子结点,取出栈顶结点,将p指向栈顶结点的右子结点,参见代码如下:

解法二:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> st;
        TreeNode *p = root;
        while (!st.empty() || p) {
            if (p) {
                st.push(p);
                res.push_back(p->val);
                p = p->left;
            } else {
                p = st.top(); st.pop();
                p = p->right;
            }
        }
        return res;
    }
};

到此这篇关于C++实现LeetCode(144.二叉树的先序遍历)的文章就介绍到这了,更多相关C++实现二叉树的先序遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用Matlab绘制好看的旋转九边形

    利用Matlab绘制好看的旋转九边形

    这篇文章主要为大家介绍了如何利用Matlab绘制超好看的旋转九边形。文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下
    2022-03-03
  • C语言中的函数指针基础学习教程

    C语言中的函数指针基础学习教程

    这篇文章主要介绍了C语言中的函数指针基础学习教程,包括函数指针作为参数来传递等重要知识,需要的朋友可以参考下
    2016-04-04
  • C++中的数组、链表与哈希表

    C++中的数组、链表与哈希表

    这篇文章主要介绍了C++中的数组、链表与哈希表,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • C语言中getchar()的原理以及易错点解析

    C语言中getchar()的原理以及易错点解析

    用getchar()函数读取字符串时,字符串会存储在输入缓冲区中,包括输入的回车字符,下面这篇文章主要给大家介绍了关于C语言中getchar()的原理以及易错点解析的相关资料,需要的朋友可以参考下
    2022-03-03
  • C语言编程实例之输出指定图形问题

    C语言编程实例之输出指定图形问题

    这篇文章主要介绍了C语言编程实例之输出指定图形问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Qt与Web混合开发实现双向通信的示例

    Qt与Web混合开发实现双向通信的示例

    本文主要介绍了Qt与Web混合开发实现双向通信的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Mingw64编译wxWidgets 3.0.2常见错误分析

    Mingw64编译wxWidgets 3.0.2常见错误分析

    这篇文章主要介绍了Mingw64编译wxWidgets 3.0.2常见错误分析,需要的朋友可以参考下
    2016-11-11
  • C++ Primer 标准库vector示例详解

    C++ Primer 标准库vector示例详解

    该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,并提供了代码示例来说明vector的使用方法,感兴趣的朋友一起看看吧
    2025-03-03
  • C语言数据结构之算法的时间复杂度

    C语言数据结构之算法的时间复杂度

    这篇文章主要介绍了C语言数据结构之算法的时间复杂度,文章基于c语言的相关资料展开详细介绍,具有一定的参价值,需要的小伙伴可以参考一下
    2022-05-05
  • c++中string类型和int类型相互转换的几种常用方法

    c++中string类型和int类型相互转换的几种常用方法

    我们在编写程序时,经常涉及到int与string之间的类型转换,本文主要介绍了c++中string类型和int类型相互转换的几种常用方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08

最新评论