翻转二叉树:
首先要想整体思路:
翻转一个二叉树就是先将左子树和右子树翻转,然后对作用左子树翻转函数(对左子树中的所有左右结点翻转),对右子树进行翻转函数
那么递归部分如下:
swap(node->left ,node->right); reverse(node->left); reverse(node->right);
这里需要注意的是reverse(node->left);和reverse(node->right);分别代表我遍历到了node->left,node->right这个结点,要对这两个结点进行操作
然后确定终止条件:也就是当二叉树是一个空树的时候什么都不做,直接返回node
然后带入图谱中看看需不需要加点什么(注意应是从右向左看,从而模拟弹栈的过程),遍历完图谱后可知不需要加什么程序,(注意如果没有返回值或则返回值仅仅起到一个表明什么都不做的作用,比如此题,那么就应该在遍历的时候将递归的代码删掉)因此整体程序就是:
TreeNode* invertTree(TreeNode* node) { if (node == NULL) return node; swap(node->left, node->right); // 中 invertTree(node->left); // 左 invertTree(node->right); // 右 return node; }
左叶子之和
首先确定整体思路:
找到左子树的左叶子,找到右子树的左叶子,然后将它们的值加和
那么递归部分如下:
int left= sumfun(node->left); int right= sumfun(node->right); return right+left
然后确定终止条件,就是这个二叉树如果是一个空树的话,我们就返回0
然后带入图谱中看看需不需要加点什么(注意应是从右向左看,从而模拟弹栈的过程),感觉需要做点什么(注意如果有返回值那么就应该在遍历的时候将递归的代码换成下一层的返回值),应该在每层函数中遍历到左节点后,也就是运行到int left= sumfun(node->left);判断这个左节点是否为空,它的左右子节点是否为空,如果为空,那么就取这个左子节点就是左叶子结点那么就取这个左子节点的值,作为这一层的返回值。比如说3结点,运行到f(3)时,判断1结点的值是否为空,它的左右子节点是否为空,写成代码就是:
1 if (node->left && !node->left->left && !node->left->right) { // 左子树就是一个左叶子的情况 2 leftValue = node->left->data_; 3 }
然后根据上述代码知,node的子节点不能为空,否则node->left->left,node->left->right就会出异常,因此终止条件还得有:
1 if (node->left == NULL && node->right == NULL) return 0;
这个终止条件
因此整体代码为:
1 int sumOfLeftLeaves(Node* node) { 2 if (node == NULL) return 0; 3 if (node->left == NULL && node->right == NULL) return 0; 4 5 int leftValue = sumOfLeftLeaves(node->left); // 左 6 if (node->left && !node->left->left && !node->left->right) { // 左子树就是一个左叶子的情况 7 leftValue = node->left->data_; 8 } 9 int rightValue = sumOfLeftLeaves(node->right); // 右 10 int sum = leftValue + rightValue; // 中 11 return sum; 12 }