leetcode的题目:
给定一个二叉树,给出二叉树的先序、中序、后序的遍历结构
解题思路【递归解法】:
### 1.第一个知识点二叉树的先序遍历、中序遍历、后序遍历
先序遍历结构:根 --> 左 -> 右 遍历结果:1->2->3
中序遍历结构:左–> 根–> 右 遍历结果:1->3->2
后序遍历结构:左–>右–>根 遍历结果:3->2->1
### 2. 第一种解法:递归的解法;递归的解法三种遍历相差不大,因此就写一个先序遍历;递归比较简单直接上代码就可以;以go语言为例子;
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func preorderTraversal(root *TreeNode) []int {
var a []int
doPreorder(root,&a)
return a
}
func doPreorder(root *TreeNode, result *[]int){
if root ==nil{
return
}
*result = append(*result,root.Val)
doPreorder(root.Left,result)
doPreorder(root.Right,result)
}
###3. 递归的解法在go语言里面有两个点需要注意:
-
在leetcoe中要求返回的是一个数组,因此如果直接在该方法中进行递归去return在遇到nil的节点会把数组清空,因此递归不能return,需要开辟一个新的方法去调用;
-
在开辟数组调用传slice的是时候,需要传个指针,这里由于在go中都是值传递,而map、chan、slice比较特殊默认传的是指针,但是如果用了slice的append方法则更为特殊;具体看这篇博客写的:https://www.cnblogs.com/snowInPluto/p/7477365.html
解题思路【非递归解法】
思路的灵感:根据递归操作的解法,
- 是一个从根节点一直到最左子树的叶子节点;
- 然后向前返回;找到右节点
- 重复步骤一
因此很容易想到是一个压栈的操作,一直压倒最左子树的叶子节点,然后从栈顶弹出,判断其是否有右节点,然后重复压栈操作;
开始上代码:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
// 前序遍历
func preorderTraversal(root *TreeNode) []int {
var result []int
if root==