关于使用回溯这种模式的思考

今天做了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 }

总结:实现这个题目的思想就是回溯的思想,然后使用的是递归算法,具体描述递归算法我觉得很难,想不到很好的能够总结递归的方法

 

posted @ 2020-09-16 22:18  大头Tou  阅读(88)  评论(0)    收藏  举报