226. 翻转二叉树
- 这道题用递归来写会比较号理解
- 主要思路是:
- 新建一个节点,用先序遍历,node = new TreeNode(root->val);
- node->left的左子数=root->右子树,当然是在root->右子树有的情况下
- node右子树=root左子树
TreeNode* invertTree(TreeNode* root) {
// 递归出口
if(root == NULL) return NULL;
// 递归关系
TreeNode* node = new TreeNode(root->val);
if(root->right) node->left = invertTree(root->right);
if(root->left) node->right = invertTree(root->left);
return node;
}
101. 对称二叉树
主要的思路:
// 递归来做
// 对称二叉树定义: 对于树中 任意两个对称节点 LL 和 RR ,一定有:
// L.val = R.val // 即此两对称节点值相等
// L.left.val = R.right.val // 即L的左子节点和R的右子节点对称
// L.right.val = R.left.val // 即L的右子节点和R的左子节点对称
// 根据以上规律,考虑从顶至底递归, 判断每对节点是否对称,从而判断树是否为对称二叉树
如图:
bool isSymmetric(TreeNode* root){
return root==null?true:recur(root->left, root-right)&&recur(root->right, root->left);
}
bool recur(TreeNode* L, TreeNode* R){
// 几种情况,看值是否相等 L->val == R->val
// 递归出口
if(L == null && R == null) return true;
if(L == null || R==null || L->val != R->val) return false;
// 递推方程
return recur(L->left, R->right)&&recur(L->right, R->left);
}