94. 二叉树的中序遍历

package maintype TreeNode struct {Val intLeft *TreeNodeRight *TreeNode}// 左中右func inorderTraversal(root *TreeNode) []int {var l []int//如果是空直接返回if root == nil {return nil}// 创建栈 递归从根源就是栈结构stack := make([]*TreeNode, 0)node := root// 只要当前节点不为空,或者栈不为空,就一直循环查找左节点for node != nil || len(stack) > 0 {//查找左节点if node != nil {// 将左节点放入栈中stack = append(stack, node)node = node.Left} else {// 获取站顶节点curr := stack[len(stack)-1]// 出栈操作stack = stack[:len(stack)-1]l = append(l, curr.Val)// 遍历右节点node = curr.Right}}return l}func main() {a := &TreeNode{Val: 1,}b := &TreeNode{Val: 2,}a.Left = bc := &TreeNode{Val: 3,}a.Right = cd := &TreeNode{Val: 4,}b.Left = de := &TreeNode{Val: 5,}b.Right = ef := &TreeNode{Val: 6,}c.Left = f// 4,2,5,1,6,3inorderTraversal(a)}
Java代码实现
public class Solution {public List < Integer > inorderTraversal(TreeNode root) {List < Integer > res = new ArrayList < > ();Stack < TreeNode > stack = new Stack < > ();TreeNode curr = root;while (curr != null || !stack.isEmpty()) {while (curr != null) {stack.push(curr);curr = curr.left;}curr = stack.pop();res.add(curr.val);curr = curr.right;}return res;}}
144. 二叉树的前序遍历

首先我们应该创建一个Stack用来存放节点,首先我们想要打印根节点的数据,此时Stack里面的内容为空,所以我们优先将头结点加入Stack,然后打印。
之后我们应该先打印左子树,然后右子树。所以先加入Stack的就是右子树,然后左子树。

import java.util.LinkedList;import java.util.List;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;};}public class binary_tree_preorder_traversal_144 {public static List<Integer> preorderTraversal(TreeNode root) {LinkedList<TreeNode> stack = new LinkedList<>();LinkedList<Integer> output = new LinkedList<>();if (root == null) {return output;}stack.add(root);while (!stack.isEmpty()) {TreeNode node = stack.pollLast();output.add(node.val);if (node.right != null) {stack.add(node.right);}if (node.left != null) {stack.add(node.left);}}return output;}public static void main(String[] args) {TreeNode one = new TreeNode(1);TreeNode two = new TreeNode(2);TreeNode three = new TreeNode(3);one.right = two;two.left = three;List<Integer> r = preorderTraversal(one);System.out.println(r);}}
go 实现
package mainimport "fmt"// 前序遍历type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode}// 递归方法func preorderTraversal(root *TreeNode) []int{if root==nil {return nil}fmt.Println(root.Val)preorderTraversal1(root.Left)preorderTraversal1(root.Right)return nil}// 中左右func preorderTraversal1(root *TreeNode) []int {var l []int//如果是空直接返回if root == nil {return nil}// 创建栈 递归从根源就是栈结构stack := make([]*TreeNode, 0)curr := root// 只要当前节点不为空,或者栈不为空,就一直循环查找左节点for curr != nil || len(stack) > 0 {//查找左节点for (curr != nil){stack = append(stack,curr)fmt.Println(curr.Val)l = append(l,curr.Val)curr = curr.Left}curr = stack[len(stack)-1]stack = stack[:len(stack)-1]curr = curr.Right}return l}// 中左右func preorderTraversal2(root *TreeNode) []int {var l []int//如果是空直接返回if root == nil {return nil}// 创建栈 递归从根源就是栈结构stack := make([]*TreeNode, 0)stack = append(stack,root)// 只要当前节点不为空,或者栈不为空,就一直循环查找左节点for len(stack) > 0 {curr := stack[len(stack)-1]stack = stack[:len(stack)-1]fmt.Println(curr.Val)l = append(l,curr.Val)if curr.Right != nil {stack = append(stack,curr.Right)}if curr.Left != nil {stack = append(stack,curr.Left)}}return l}//https://leetcode-cn.com/problems/binary-tree-preorder-traversal/func main() {a := &TreeNode{Val: 1,}b := &TreeNode{Val: 2,}a.Left = bc := &TreeNode{Val: 3,}a.Right = cd := &TreeNode{Val: 4,}b.Left = de := &TreeNode{Val: 5,}b.Right = ef := &TreeNode{Val: 6,}c.Left = f// 1 2 4 5 3 6preorderTraversal1(a)}

