
层次遍历
非递归解法是创建一个栈 首先把root元素放入中,每次出栈,直到全部出栈
package mainimport "fmt"type TreeNode struct {Val intLeft *TreeNodeRight *TreeNode}func invertTree(root *TreeNode) *TreeNode {if root==nil {// 递归结束条件return nil}right:= invertTree(root.Right)// 返回已经翻转的右节点left := invertTree(root.Left) // 返回已经翻转的左节点// 当前需要一级需要做的是把 左节点指向已经翻转的右节点 右节点指向已经翻转的左节点root.Left = rightroot.Right = leftreturn root}func invertTree1(root *TreeNode) *TreeNode {if root==nil {// 递归结束条件return nil}// 当前需要一级需要做的是把 左节点指向右节点 右节点指向已经翻转的左节点temp := root.Leftroot.Left = root.Rightroot.Right = tempinvertTree(root.Left) // 翻转的左节点invertTree(root.Right)// 返翻转的右节点return root}func invertTree2(root *TreeNode) *TreeNode {if root==nil {return nil}l := make([]*TreeNode,0)l = append(l ,root)for len(l)>0{curr := l[0]l = l[1:]left :=curr.Leftright :=curr.Rightcurr.Right = leftcurr.Left = rightif curr.Left!=nil {l = append(l,curr.Left)}if curr.Right!=nil {l = append(l,curr.Right)}}return root}func main() {a := &TreeNode{Val: 4,}b := &TreeNode{Val: 2,}a.Left = bc := &TreeNode{Val: 7,}a.Right = cd := &TreeNode{Val: 1,}b.Left = de := &TreeNode{Val: 3,}b.Right = ef := &TreeNode{Val: 6,}c.Left = fg := &TreeNode{Val: 9,}c.Right = g// 9 7 64 3 2 1invertTree2(a)printOrder(a)}func printOrder(root *TreeNode){if root== nil {return}printOrder(root.Left)fmt.Println(root.Val)printOrder(root.Right)return}
非递归Java
class Solution {public TreeNode invertTree(TreeNode root) {if(root==null) {return null;}//将二叉树中的节点逐层放入队列中,再迭代处理队列中的元素LinkedList<TreeNode> queue = new LinkedList<TreeNode>();queue.add(root);while(!queue.isEmpty()) {//每次都从队列中拿一个节点,并交换这个节点的左右子树TreeNode tmp = queue.poll();TreeNode left = tmp.left;tmp.left = tmp.right;tmp.right = left;//如果当前节点的左子树不为空,则放入队列等待后续处理if(tmp.left!=null) {queue.add(tmp.left);}//如果当前节点的右子树不为空,则放入队列等待后续处理if(tmp.right!=null) {queue.add(tmp.right);}}//返回处理完的根节点return root;}}
