一.前序遍历
前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。
二.中序遍历
中序遍历按照“左孩子-根结点-右孩子”的顺序进行访问。
三.后序遍历
后序遍历按照“左孩子-右孩子-根结点”的顺序进行访问。
总结:由根节点在前中后决定前中后序,三种遍历代码逻辑一样,只是打印位置不一样,非递归方式后续遍历需要两个栈后进先出打印
解决方式
1,递归
func inorderTraversal(root *TreeNode){
if root!=nil{
//前序在这里打印 inorderTraversal(root.Left) //中序在这里打印 r:=inorderTraversal(root.Right) //后序在这里打印 }}
2,非递归
func inorderTraversal(root *TreeNode){
var s Stack cur:=root for !s.empty() || cur!=nil{
for cur!=nil{
//前序遍历,在这里打印value s.push(cur) cur=cur.Left } if !s.empty(){
//注意这里是判断不是循环 cur=s.pop() //中序遍历,在这里打印value cur=cur.Right //后续遍历在这里打印但是,需要加个标识,是否进过栈,进过才打印 } }}
golang中序遍历实现例子
递归
/** * Definition for a binary tree node. * type TreeNode struct {
* Val int * Left *TreeNode * Right *TreeNode * } */func inorderTraversal(root *TreeNode) []int {
var m []int if root!=nil{
l:=inorderTraversal(root.Left) m=append(l,root.Val) r:=inorderTraversal(root.Right) m=append(m,r...) } return m}
非递归
/** * Definition for a binary tree node. * type TreeNode struct {
* Val int * Left *TreeNode * Right *TreeNode * } */func inorderTraversal(root *TreeNode) []int {
var