1、求根节点到叶节点数字之和
1.1 题目描述
给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。
每条从根节点到叶节点的路径都代表一个数字:
例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。
计算从根节点到叶节点生成的 所有数字之和 。
叶节点 是指没有子节点的节点。
1.2 思路:关键点在于怎么深度搜索:如果当前节点的左右子树都为空,返回sum*10+root->val;否则继续深搜
1.3 Demo
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int sumNumbers(TreeNode* root) {
if(root==nullptr)
return 0;
return dfs(root,0);
}
int dfs(TreeNode* root,int sum){
if(root==nullptr)
return 0;
else if(root->left==nullptr&&root->right==nullptr)
return sum*10+root->val;
return dfs(root->left,sum*10+root->val)+dfs(root->right,sum*10+root->val);
}
};
All is Well !!!
2、中序遍历模板的应用(搜索树)
2.1 题目描述:
给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
示例 1:
输入:root = [3,1,4,null,2], k = 1
输出:1
2.2 思路:中序遍历——即为二叉搜索树从小到大排序
2.3 Demo
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> res;
int kthSmallest(TreeNode* root, int k) {
//中序遍历-从小到大
inOrder(root);
return res[k-1];
}
void inOrder(TreeNode* root){
if(root==nullptr)
return ;
inOrder(root->left);
res.push_back(root->val);
inOrder(root->right);
}
};
All is Well !!!
3、完全二叉树的节点个数(前序遍历即可)
3.1 题目描述:
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2^h个节点。
3.2 思路:
对于任意二叉树,都可以通过广度优先搜索或深度优先搜索计算节点个数,时间复杂度和空间复杂度都是 O(n)O(n)
3.3 Demo:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int count=0;
int countNodes(TreeNode* root) {
preOrder(root);
return count;
}
void preOrder(TreeNode* root){
if(root==nullptr){
return ;
}
count++;
preOrder(root->left);
preOrder(root->right);
}
};