LeetCode 94:Binary Tree Inorder Traversal(中序遍历)

2024-02-14 16:38

本文主要是介绍LeetCode 94:Binary Tree Inorder Traversal(中序遍历),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Given a binary tree, return the inorder traversal of its nodes’ values.

For example:
Given binary tree {1,#,2,3},

1
\
2
/
3

return [1,3,2].
题目要求对二叉树进行非递归的中序遍历,所谓中序遍历即,先访问左子树、再访问根节点、然后是右子树。通常采用递归的方法,题目要求采用非递归的方法实现。算法如下:

1)如果根节点非空,将根节点加入到栈中。

2)如果栈不空,取栈顶元素(暂时不弹出),

 如果左子树已访问过,或者左子树为空,则弹出栈顶节点,将其值加入数组,如有右子树,将右子节点加入栈中。如果左子树不为空,切未访问过,则将左子节点加入栈中,并标左子树已访问过。

3)重复第二步,直到栈空。

代码如下:

//包裹结构体,标明左子树是否已经访问过struct TreeNodeWrapper{struct TreeNode *pNode;bool lVisited; //左子树已访问过bool rVisited; //右子树已访问过TreeNodeWrapper(TreeNode * p){pNode = p; lVisited= false; rVisited= false;}
};
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNodeWrapper*> node_stack;if (root == NULL)return result;node_stack.push(new TreeNodeWrapper(root));while(!node_stack.empty()){TreeNodeWrapper* pNode = node_stack.top();if (pNode->lVisited || pNode->pNode->left==NULL) //左子树已访问过,或者为空{node_stack.pop();result.push_back(pNode->pNode->val); //访问节点,访问右子树if (pNode->pNode->right) {node_stack.push(new TreeNodeWrapper(pNode->pNode->right));}delete pNode;}else{      //访问左子树,并标记node_stack.push(new TreeNodeWrapper(pNode->pNode->left));pNode->lVisited = true;}}return result;}
};

方法二,不使用包裹结构体。上面的解法虽然原理上比较简单,当使用了一个包裹结构体,和大量的New/delete操作,显得比较复杂。不如下面这种算法比较简洁。

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack< TreeNode *> node_stack;TreeNode * pNode = root;while (pNode || !node_stack.empty()) {//节点不为空,加入栈中,并访问节点左子树if (pNode != NULL) {node_stack.push(pNode);pNode = pNode->left;}else{//节点为空,从栈中弹出一个节点,访问这个节点,pNode = node_stack.top();node_stack.pop();//访问节点右子树result.push_back(pNode->val);pNode = pNode->right;}}return result; }
};

这篇关于LeetCode 94:Binary Tree Inorder Traversal(中序遍历)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/709028

相关文章

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &