1.找树左下角的值 leetcode
找出 最后一行 最左边 的 值 ,也就是 深度 最深 的的 节点
class Solution {
public:
int maxheight = INT_MIN;
int result;
void num ( TreeNode* cur , int height ) {
if ( cur -> right == NULL && cur -> left == NULL ) {
if ( height > maxheight ) {
maxheight = height;
result = cur -> val;
}
return ;
}
if ( cur -> left ) num ( cur -> left , height + 1 );
if ( cur -> right ) num ( cur -> right , height + 1 );
return ;
}
int findBottomLeftValue(TreeNode* root) {
num( root , 0);
return result;
}
};
num ( cur -> left , height + 1 ) 这语句 实际上 height 并没有改变 , 传参 传的 height+ 1
递归中 都 带着 回溯 , 可以模拟回溯的过程
if (root->left) { // 左
depth++; // 深度加一
traversal(root->left, depth);
depth--; // 回溯,深度减一
}
if (root->right) { // 右
depth++; // 深度加一
traversal(root->right, depth);
depth--; // 回溯,深度减一
}
2.路径总和 leetcode
找到一条路径 值相加 等于所给target , 如果有返回 true , 没有 返回false
class Solution {
public:
bool work( TreeNode* cur , int targer ) {
if ( cur -> right == NULL && cur -> left == NULL && targer == 0 )return true;
if (cur -> right == NULL && cur -> left == NULL && targer != 0) return false;
if ( cur -> left ) {
if ( work( cur -> left , targer - cur -> left -> val) ) return true;
}
if ( cur -> right ) {
if ( work( cur -> right , targer - cur -> right -> val) ) return true;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if ( root == NULL ) return false;
else return work( root , targetSum - root -> val );
}
};
3.从中序与后序遍历序列构造二叉树 leetcode
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,构造并返回这颗 二叉树
第一步:如果数组大小为零的话,说明是空节点了。
第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。
第三步:找到后序数组最后一个元素在中序数组的位置,作为切割点
第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组)
第五步:切割后序数组,切成后序左数组和后序右数组
第六步:递归处理左区间和右区间
class Solution {
public:
TreeNode* Tree( vector < int > &inorder , vector < int > & postorder ) {
if ( postorder.size() == 0 ) return NULL ;
int mid = postorder[ postorder.size() - 1 ];
TreeNode* root = new TreeNode(mid);
int i;
for ( i = 0 ; i < inorder.size() ; i++ ) {
if ( inorder[i] == mid )break;
}
vector < int > leftinorder( inorder.begin() , inorder.begin() + i );
vector < int > rightinorder( inorder.begin() + i + 1, inorder.end() );
postorder.erase( postorder.begin() + postorder.size() - 1);
vector < int > leftpostorder ( postorder.begin() , postorder.begin() + leftinorder.size() );
vector < int > rightpostorder ( postorder.begin() + leftinorder.size() , postorder.end() );
root -> left = Tree( leftinorder , leftpostorder );
root -> right = Tree ( rightinorder , rightpostorder );
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return Tree ( inorder , postorder );
}
};