【LeetCode】144. Binary Tree Preorder Traversal 二叉树先序遍历的非递归实现
来源:互联网 发布:中行中银淘宝信用卡 编辑:程序博客网 时间:2024/05/26 22:57
题目:
翻译:给定一个二叉树,返回先序遍历的序列。
分析:二叉树的先序遍历、中序遍历及后序遍历算法是数据结构中最基础的遍历算法。
先序遍历:先访问根节点的数据,再访问左孩子节点的数据,最后访问右孩子节点的数据。图中例子先序遍历输出的序列为:【1,2,3】。
中序遍历:先访问左孩子节点的数据,再访问根节点的数据,最后访问右孩子节点的数据。图中例子中序遍历输出的序列为:【1,3,2】。
后序遍历:先访问左孩子节点的数据,再访问右孩子节点的数据,最后访问根节点的数据。图中例子后序遍历输出的序列为:【3,2,1】。
这三种遍历算法若用递归来写是非常简单的,但是如果采用非递归的方式来实现,相对比较复杂。
以先序遍历为例,可以使用栈的数据结构来实现先序遍历的非递归方法。具体操作如下:
1.若二叉树为空,则返回空序列,结束;若不为空,转2;
2.新建一个空栈,将根节点加入栈中;
3.若栈不为空,取出栈顶节点,访问该节点的数据(将栈顶元素加入返回的序列中);
判断该节点的【右节点】是否为空,若不为空,将该节点的右节点加入到栈中;
判断该节点的【左节点】是否为空,若不为空,将该节点的左节点加入到栈中;
(注意:此处是先判断右节点,再判断左节点,因为栈的特点是“后进先出”,左节点总在右节点先遍历,所以要后加入栈中。)
4.重复3,直到栈为空,返回最终得到的先序遍历序列。
代码:
在下面的代码中使用了C#中的List来实现一个栈。
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int x) { val = x; } * } */public class Solution { public IList<int> PreorderTraversal(TreeNode root) { List<int> results=new List<int>(); if(root==null) return results; List<TreeNode> stack=new List<TreeNode>();//新建一个队列 stack.Add(root); while(stack.Count()!=0)//若栈不为空,取出栈顶元素,访问数值,判断左右孩子是否为空,若不为空,加入栈,先加右孩子,再加左孩子 { TreeNode temp=stack.Last();//取出栈顶元素 stack.Remove(stack.Last());//移除 results.Add(temp.val); if(temp.right!=null) stack.Add(temp.right); if(temp.left!=null) stack.Add(temp.left); } return results; }}
- 【LeetCode】144. Binary Tree Preorder Traversal 二叉树先序遍历的非递归实现
- LeetCode Binary Tree Preorder Traversal (二叉树先序遍历非递归)
- LeetCode 144. Binary Tree Preorder Traversal (前序遍历的非递归实现)
- LeetCode 144. Binary Tree Preorder Traversal (二叉树先根序遍历,非递归)
- LeetCode Binary Tree Preorder Traversal 前序遍历二叉树 递归和非递归解法
- 【LeetCode】Binary Tree Preorder Traversal 二叉树前序遍历递归以及非递归算法
- 144.leetcode Binary Tree Preorder Traversal(medium)[二叉树先序遍历]
- [leetcode-二叉树先序遍历]--144.Binary Tree Preorder Traversal
- 【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】
- [leetcode] Binary Tree Preorder Traversal 非递归先序遍历
- 【leetcode】非递归先序遍历二叉树(Binary Tree Preorder Traversal)
- LeetCode:Binary Tree Preorder Traversal(非递归方法前序遍历二叉树)
- 【Leetcode】144. Binary Tree Preorder Traversal 【Tree】【递归&&非递归】
- leetcode 144. Binary Tree Preorder Traversal-前序遍历|递归|非递归
- Binary Tree Preorder Traversal 二叉树的先序遍历,使用堆栈,非递归
- LintCode Binary Tree Preorder Traversal二叉树的前序遍历(非递归)
- LeetCode Binary Tree Postorder Traversal(二叉树的后序遍历 非递归实现)
- binary tree preorder traversal(二叉树先序遍历非递归)java
- git使用入门
- 安卓视频播放器 一行代码快速实现视频播放,Android视频播放,AndroidMP3播放,安卓视频播放一行代码搞定,仿今日头条 Android视频播放器
- CSS定位position使用介绍
- android_手势滑动的实现
- ThinkPHP学习--ThinkPHP中的单字母函数汇总
- 【LeetCode】144. Binary Tree Preorder Traversal 二叉树先序遍历的非递归实现
- uLua记录--LuaMgr
- tcpdump:运行在命令行下的嗅探工具
- iOS 元素坐标转换
- 10 个 Redis 建议/技巧
- selinux mode DAC and MAC
- CMakeLists.txt与Makefile 的区别
- 贪心算法—Problem E
- javascript笔记1-links