94.给定一个二叉树的根节点 root ,返回它的 中序 遍历。
错误代码:
void search (TreeNode* root,vector& result){
if(!root)
return;
if(root->left)
return search(root->left,result);
result.push_back(root->val);
if(root->right)
return search(root->right,result);
}
vector inorderTraversal(TreeNode* root) {
vector result;
if(!root)
return result;
search (root,result);
return result;
}
输入:[1,null,2,3]
输出:[1,3]
预期结果:[1,3,2]
正确代码:
void inorder(TreeNode* root, vector& res) {
if (!root) {
return;
}
inorder(root->left, res);
res.push_back(root->val);
inorder(root->right, res);
}
vector inorderTraversal(TreeNode* root) {
vector res;
inorder(root, res);
return res;
}
错误分析:
1.return到底什么时候加?
有返回值的时候吧。
2.用不用判断roor->left?
一般不用吧
226、翻转二叉树
错误代码:
TreeNode* invertTree(TreeNode* root) {
if(!root)
return root;
root->left=invertTree(root->right);
root->right=invertTree(root->left);
return root;
}
正确代码:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) {
return nullptr;
}
TreeNode* left = invertTree(root->left);
TreeNode* right = invertTree(root->right);
root->left = right;
root->right = left;
return root;
}
错误分析:
原 root.left 的指向已经改变了?
如果先给root->left赋值,在计算root->right时,root->left已经被改变了。所以,应该先计算结果,再赋值,赋的值没有被改变过。
543.二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
给定二叉树:
1 / \ 2 3 / \ 4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
知道使用递归,但是没有想法。
思路:
两个叶子节点之间的路径=根节点到左右叶子结点的深度之和。
所以首先,我们要写出一个求深度的函数,这里用到深度优先搜索。
int depth(TreeNode* root)
{
if(!root)
return 0;
int L=depth(root->left);
int R=depth(root->right);
return max(L,R)+1;
}
之后,设置一个变量来储存最大路径,对每一个节点,都把它左右子树深度相加,然后与该变量进行比较。
int maxd=0;
int depth(TreeNode* root)
{
if(!root)
return 0;
int L=depth(root->left);
int R=depth(root->right);
if(maxd
主要是没想到把计算每个节点最大路径放在计算深度的函数里。
错误代码:
if(maxdleft)+depth(root->right))
maxd=depth(root->left)+depth(root->right);
return max(depth(root->left),depth(root->right))+1;
这种情况相当于递归了三次,会导致超时!