关于使用回溯这种模式的思考
今天做了leetcode上的每日一练,题干是翻转二叉树
链接:https://leetcode-cn.com/problems/invert-binary-tree/
回溯类似于是一种穷尽发,就是当事情发展到尽头之后,再回头去执行另外一条路子,二叉树的遍历(无论是前/中/后)是回溯思想的一种很好的体验
题干就是以根节点所在的节点为中心,折叠翻转:

我的想法就是把根节点的左右两个几点互相交换,就是2和7交换 1和3交换 6和9交换 简单来说就是把父亲节点的子节点交换
递归的具体操作步骤用语言不知道怎么描述,代码可能简单些:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public TreeNode invertTree(TreeNode root) { 12 if (root!=null){ 13 swapNode(root); 14 } 15 16 return root; 17 } 18 public void swapNode(TreeNode root){ 19 if (root==null) return; 20 TreeNode right = root.right;//找出root的左右孩子节点 21 TreeNode left = root.left; 22 root.left = right;//把右节点赋给左节点 23 swapNode(root.left);//接着去判断左节点,直到左节点是null,如果左节点是null了,那就说明到了二叉树的最底层了,然后我们就要去找右节点了 24 root.right = left; 25 swapNode(root.right); 26 } 27 }
总结:实现这个题目的思想就是回溯的思想,然后使用的是递归算法,具体描述递归算法我觉得很难,想不到很好的能够总结递归的方法

浙公网安备 33010602011771号