二叉树递归系列文章目录
提示:晕递归,递进入一看,发现是自己
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
1.前序,中序,后序遍历
2.递归中的局部变量,传递的参数,全局变量
2.1 递归的理解
递归算法通常意味着对每个节点进行相同操作,如果该节点有子节点,则同样的操作也会应用到其左子节点和右子节点上。如果没有子节点,直接返回。
递归函数通常有两个部分:基本情况(base case)和递归情况(recursive case)。基本情况是递归停止的条件,而递归情况是函数调用自己来解决问题的一部分。
基本情况:一定有一个root为NULL的的情况,直接返回
基本情况是对每一个节点都操作的,需要对任意节点都需要满足的条件。
可能还有一层处理问题的基本情况,比如找节点,找深度,找到了直接返回。
没找到就继续向左右子树查找。
如果是返回最深层的节点个数,
2.2 计数size(传引用的方式)
2.3 深度(参数+1)
2.4 preparent(上一层的父节点) (传参)
3.题型类别?
3.1 计数型(size和深度)可以用分治法和计数法
3.2 查找型
左边没找到去右边找。
bool findValue(TreeNode* root, int value) {
if (root == nullptr) return false;
if (root->val == value) return true;
return findValue(root->left, value) || findValue(root->right, value);
}
返回指定深度的节点个数
//理解没进入下一层,k-1,初始时k=3,第三层
//进入k=2 第二层
//k=1,找到这一层的一个节点,返回1,
int TreeKLevel(BTNode* root, int k)
{
assert(k > 0);
if (root == NULL)
return 0;
if (k == 1)
return 1;
return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}