leetcode226.翻转二叉树

Posted by serrini on March 23, 2020

leetcode226.翻转二叉树

Question

翻转一棵二叉树。

示例:

输入:

输出:

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/invert-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Answer

法一:前序遍历

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

public static TreeNode invertTree1(TreeNode root) {
		if(root == null) {
			//递归边界
			return null;
		}
		
		//swap
		TreeNode temp = root.left;
		root.left = root.right;
		root.right = temp;

		invertTree(root.left); //左子树内部交换
		invertTree(root.right); //右子树内部交换
		return root;
    }
    

法二:中序遍历 注意中序遍历根结点翻转后,左右子树已经交换过,原本invertTree(root.right)要改成invertTree(root.left)

 public static TreeNode invertTree2(TreeNode root) {
		if(root == null) {
			//递归边界
			return null;
		}
		
		invertTree(root.left);
		
		//swap
		TreeNode temp = root.left;
		root.left = root.right;
		root.right = temp;

		invertTree(root.left);
		return root;
    }

法三:后序遍历

public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }

        invertTree(root.left);
        invertTree(root.right);

        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
        return root;
    }

Attention

写一个二叉树工具类实现创建二叉树,层序遍历 创建二叉树时 输入是先根输入:4 2 1 0 0 3 0 0 7 6 0 0 9 0 0

翻转后层序遍历输出应该是:4 7 2 9 6 3 1

package pid226;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Solution {
	
	public static TreeNode invertTree(TreeNode root) {
		if(root == null) {
			//递归边界
			return null;
		}
		
		//swap
		TreeNode temp = root.left;
		root.left = root.right;
		root.right = temp;

		invertTree(root.left); //左子树内部交换
		invertTree(root.right); //右子树内部交换
		return root;
    }
	
	
	public static TreeNode createBiTree(TreeNode root) {
		Scanner scanner = new Scanner(System.in);
		int num = scanner.nextInt();
		if(num == 0) {
			return null;
		}else {
			root.val = num;
			root.left = createBiTree(new TreeNode(0));
			root.right = createBiTree(new TreeNode(0));
			return root;
		}
		
	}
	
	public static void levelTraverse(TreeNode root) {
		Queue<TreeNode> queue = new LinkedList<TreeNode>();
		queue.offer(root);
		while(!queue.isEmpty()) {
			TreeNode treenode = queue.poll();
			System.out.println(treenode.val);
			if(treenode.left != null) {
				queue.offer(treenode.left);
			}
			if(treenode.right != null) {
				queue.offer(treenode.right);
			}
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeNode root = new TreeNode();
		
		root = createBiTree(root);
		invertTree(root);
		levelTraverse(root);
	}
}