二叉树

后继节点、前驱节点:都是按照中序来算的。

中序遍历:一般用递归做。

二叉搜索树与双向链表:使用中序递归做模板,先找到第一个节点,然后再分别给左右节点找下一个节点。实现方式如下:

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();

posted @ 2023-03-26 01:06  是小宇呀  阅读(30)  评论(0)    收藏  举报