层次遍历
非递归解法是创建一个栈 首先把root元素放入中,每次出栈,直到全部出栈
package main
import "fmt"
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func invertTree(root *TreeNode) *TreeNode {
if root==nil {// 递归结束条件
return nil
}
right:= invertTree(root.Right)// 返回已经翻转的右节点
left := invertTree(root.Left) // 返回已经翻转的左节点
// 当前需要一级需要做的是把 左节点指向已经翻转的右节点 右节点指向已经翻转的左节点
root.Left = right
root.Right = left
return root
}
func invertTree1(root *TreeNode) *TreeNode {
if root==nil {// 递归结束条件
return nil
}
// 当前需要一级需要做的是把 左节点指向右节点 右节点指向已经翻转的左节点
temp := root.Left
root.Left = root.Right
root.Right = temp
invertTree(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.Left
right :=curr.Right
curr.Right = left
curr.Left = right
if 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 = b
c := &TreeNode{
Val: 7,
}
a.Right = c
d := &TreeNode{
Val: 1,
}
b.Left = d
e := &TreeNode{
Val: 3,
}
b.Right = e
f := &TreeNode{
Val: 6,
}
c.Left = f
g := &TreeNode{
Val: 9,
}
c.Right = g
// 9 7 64 3 2 1
invertTree2(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;
}
}