平衡二叉树
题目解答
#include<iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int a): val(a), left(nullptr), right(nullptr){}
};
TreeNode* creatTree() {
int val;
cout << "please input the role :(if the role is -1 , so the node is NULL) ";
cin >> val;
if (val == -1) return nullptr;
else {
TreeNode* root = new TreeNode(val);
cout << "About " << val << "'s left TreeNode, ";
root->left = creatTree();
cout << "About " << val << "'s right TreeNode, ";
root->right = creatTree();
return root;
}
}
int TreeHight(TreeNode* node) {
if (node == NULL) return 0;
int leftHgiht = TreeHight(node->left);//左
if (leftHgiht == -1) return -1;
int rightHgiht = TreeHight(node->right);//右
if (rightHgiht == -1) return -1;
if (abs(TreeHight(node->left) - TreeHight(node->right)) > 1) return -1;
return max(TreeHight(node->left), TreeHight(node->right)) + 1;
}
bool isBalanced(TreeNode* root) {
return TreeHight(root) == -1 ? false : true;
}
int main() {
TreeNode* root = creatTree();
cout << isBalanced(root);
return 0;
}
解题心得
一开始,我认为就是只要将根节点的左子树的高度和右子树的高度求出来,然后这两个高度的差值,如果是大于1那么就要返回-1,但是这样的话就忽略了左子树/右子树是否为平衡二叉树的情况。
然后就看了卡哥的解析,然后可以构造一个求树高度的函数,值得注意的是,要用后序遍历的方式(左右中)来遍历,只要遇到左右子树之差大于1的情况,那么就直接返回-1。
二叉树的所有路径
题目解答
class Solution {
public:
void traversal(TreeNode* node, vector<int>& path, vector<string>& result){
path.push_back(node->val);
if(!node->left && !node->right){
string str;
str+=to_string(path[0]);
for(int i=1; i<path.size(); i++){
str+="->";
str+=to_string(path[i]);
}
result.push_back(str);
return;
}
if(node->left) {
// path.push_back(node->left->val);
traversal(node->left, path, result);
path.pop_back();
}
if(node->right) {
// path.push_back(node->right->val);
traversal(node->right, path, result);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<int> path;
vector<string> result;
if(root) traversal(root, path, result);
return result;
}
};
解题心得
* 该题目使用了回溯。
题目注意事项(重点看)
- 使用vector<int> path便于回溯时的撤销动作。
- 有递归就会有回溯,递归是入栈的过程,当递归到最后的叶子结点时,然后在通过后面一行的回溯,一步一步往前回溯,回退到原来的当前程序,再执行后面的代码。
- path.push_back(cur->val); 放到第一行,因为,如果将终止处理写到第一行,那么没有收集叶子节点,就直接处理和return,即遗漏掉叶子结点。
最后还要掌握 int 转换 string 的 atoi 函数。
左叶子之和
题目解答
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root==NULL) return 0;
if(root->left==NULL && root->right==NULL) return 0;
int leftRole=sumOfLeftLeaves(root->left);
if(root->left && !root->left->left && !root->left->right) leftRole=root->left->val;
int rightRole=sumOfLeftLeaves(root->right);
return leftRole+rightRole;
}
};
解题心得
注意非常重要的一点,通过父节点来收集子节点的结点值。