链接:https://leetcode.cn/problems/binary-tree-pruning/solution/c-by-xun-ge-v-9zt4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
示例
思路
解题思路
遇到树相关问题递归基本上都可以解决,因为树本身就可以用递归构造出来
关于本题需要移除了所有不包含 1 的子树的原二叉树。对于整个树而言,我们需要移除节点不为1的子树节点,将此问题划分为若干个子问题->即为每一个节点,移除不为1的左右子节点
那么每一步递归的子问题
- 都是移除当前节点左右子节点不为1的节点
具体实现
官方代码比我自己写的好很多
本人思路是递归遍历每一个节点,同时采用深度优先搜索原则,先遍历子节点,因为每一个节点都需要考虑同一个子问题移除当前节点左右子节点不为1的节点,所以需要对每一个节点都进行判断,判断左节点和右节点是否为0,为0移除对应子节点
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int dfs(struct TreeNode * root)
{
if(root == NULL)
{
return 0;
}
int left = 0;//记录左子节点值
left = dfs(root->left);//遍历左子节点,当左子节点一直存在会优先遍历左子节点,一直到左节点的叶子结点
if(left == 0)//为0,移除
{
free(root->left);
root->left = NULL;
}
int right = 0;//记录右子节点
right = dfs(root->right);//遍历右子节点
if(right == 0)
{
free(root->right);
root->right = NULL;
}
int n = (left > right ? left : right);//返回左子节点和右子节点中是否存在1
return n > root->val ? n : root->val;
}
/*
*struct TreeNode* pruneTree(struct TreeNode* root)
struct TreeNode* pruneTree:移除了所有不包含 1 的子树的原二叉树
struct TreeNode* root:头结点
返回值:移除后的新二叉树头结点
*/
struct TreeNode* pruneTree(struct TreeNode* root){
int m = dfs(root);//头节点也有可能为0,也移除
if(m == 0)
{
return NULL;
}
return root;
}
时间空间复杂度