175-翻转二叉树

本文介绍了一种翻转二叉树的算法实现,通过递归方式交换二叉树节点的左右子节点,达到整体翻转的效果。文章提供了一个具体的Java代码示例。

3.30

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
public class Solution {
    /**
     * @param root: a TreeNode, the root of the binary tree
     * @return: nothing
     */
    public void invertBinaryTree(TreeNode root) {
		if(root == null){
			return;
		}
		TreeNode tmp = root.left;
		root.left = root.right;
		root.right = tmp;
		invertBinaryTree(root.left);
		invertBinaryTree(root.right);
		
	}
}


翻转二叉树是一种常见的操作,其目标是将二叉树中的所有节点的左右子节点互换。这一操作通常用于算法训练和面试题中。以下是关于如何实现翻转二叉树的详细说明和代码实现。 ### 算法思路 翻转二叉树的核心思想是递归地交换每个节点的左右子节点。具体来说,从根节点开始,交换其左右子节点,然后递归地对左右子树进行相同的操作。当遇到空节点时,递归终止。 ### Java实现 以下是基于递归方法的翻转二叉树的Java实现: ```java /** * Definition for a binary tree node. */ class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val; this.left = left; this.right = right; } } class Solution { public static TreeNode invertTree(TreeNode root) { fn(root); return root; } private static void fn(TreeNode root) { if (root == null) { return; } // 交换当前节点的左右子节点 TreeNode temp = root.left; root.left = root.right; root.right = temp; // 递归翻转左右子树 fn(root.left); fn(root.right); } } ``` ### 代码说明 1. **定义二叉树节点**:`TreeNode` 类用于表示二叉树的节点,包含节点值 `val` 和左右子节点 `left` 和 `right`。 2. **递归函数**:`fn` 是递归函数,用于交换当前节点的左右子节点,并递归处理其左右子树。 3. **边界条件**:当当前节点为 `null` 时,递归终止。 4. **交换操作**:使用临时变量 `temp` 来交换左右子节点。 ### 示例 假设输入的二叉树为: ``` 4 / \ 2 7 / \ / \ 1 3 6 9 ``` 翻转后的结果为: ``` 4 / \ 7 2 / \ / \ 9 6 3 1 ``` ### 时间和空间复杂度 - **时间复杂度**:O(n),其中 n 是二叉树中的节点数量。每个节点仅被访问一次。 - **空间复杂度**:O(h),h 是二叉树的高度。递归调用栈的空间取决于树的高度。 ### 相关问题 1. 如何通过非递归方式实现翻转二叉树? 2. 翻转二叉树与对称二叉树的判断有何异同? 3. 翻转二叉树是否会影响树的遍历顺序? 4. 如何验证翻转后的二叉树是否正确? 5. 翻转二叉树在实际应用中有哪些场景?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值