二叉树
后继节点、前驱节点:都是按照中序来算的。
中序遍历:一般用递归做。
二叉搜索树与双向链表:使用中序递归做模板,先找到第一个节点,然后再分别给左右节点找下一个节点。实现方式如下:
Convert(pRootOfTree -> left);
/*找到第一个节点,初始化head和pre*/
if(pre == nullptr)
{
head = pRootOfTree;
pre = pRootOfTree;
}
else {
pre->right = pRootOfTree;
pRootOfTree -> left = pre;
pre = pRootOfTree;
}
Convert(pRootOfTree -> right);
对称的二叉树:可以根据递归来做。
终止条件是:树的左右孩子都是空,则返回true;当只有一个是空,或者左右孩子的值不一样时,返回false.
返回值:每一级将子问题是否匹配往上传递。
本级任务:根左右走左时根右左走右,根左右走右时根右左走左。
return recursion(root1->left,root2->right)&&recursion(root2->left,root1->right);
或者把空节点补成1001,然后层序遍历。
二叉树的镜像:
子问题:将某节点的左右节点互换位置。可以根据先左然后中然后右的顺序来做。
深刻理解递归的顺序:
TreeNode->left = Mirror(pRoot->left);
TreeNode->right = Mirror(pRoot->right);
理解这两行代码:
1.先按左节点一直往下遍历,找到最左边最底下的节点。然后回到该节点的父节点,然后才会到该父节点的右节点。
2.按从下到上的好处是,不会弄乱父节点后面子节点的顺序。
结束条件:两个子节点都是空。
返回值:交换节点的父节点。
二叉搜索树:
二叉搜索树的特点是:中序遍历是递增序。即左小于中小于右。
判断是不是平衡二叉树:
平衡二叉树的定义:左右都是平衡二叉树,并且左右子树的节点高度差小于1。
1.先定义一个结构体info
struct info
{
bool isbalanced;
int size;
};
在二叉树中找到两个节点的最近公共祖先:
推荐使用dfs来做,然后使用回溯。创建两个数组来构造路径。
dfs,加上vector.pop_back();

浙公网安备 33010602011771号