C++二叉树基础 12.30

二叉树结构:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
二叉树的遍历顺序:
前序序列:根左右 (递归中常用到)
中序序列:左根右
后序序列:左右根
遍历方式:
深度优先搜索(DFS)、广度优先搜索(BFS)

//DFS
 void dfs(TreeNode* node, int deep) {
        if (node == NULL) {
            return;
        }
        dfs(node->left , deep + 1);
        dfs(node->right, deep + 1);
 }
void BFS(TreeNode* root) {
	queue<TreeNode *> q;
	q.push(root);
	int d = 0;
while (q.empty()) {
	d++;
	for(int i =0,int n = q.size(); i<n; i++){
	    TreeNode *node = q.front();
	    q.pop();
	    printf(d+"层 "+node.value);
	    if (node->left) {
	    	q.push(node->left);
	    }
	    if (node->right) {
	    	q.push(node->right);
	    }
	}

}

算法相关:
1.计算二叉树深度
原设定,一棵树只有一个节点为1,没有节点为0
而这里的设定,只有一个节点深度设为0

int height(TreeNode* root) { 
	if (root == NULL) 
		return 0;
	return 1 + max(height(root->left), height(root->right));

思路:
1.树的深度=max(左右子树的深度) +1

2.判断平衡二叉树
平衡二叉树:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1

bool isBalanced(TreeNode* root) {
    if (root == NULL) {
      return true;
    }
	
    return isBalanced(root->right)&&isBalanced(root->left)&&abs(height(root->left) - height(root->right)) < 1 
	/*相当于这种写法,但性能来说是上面的好
	bool r =isBalanced(root->right);
    bool l =isBalanced(root->left);
    return abs(height(root->left) - height(root->right)) < 1 && r && l;*/
  }

5.二叉树的最近公共祖先
p,q为树内的两个节点,求最近公共祖先

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q){
	if(root == NULL) 
		return NULL;
	if(root == p || root == q) 
		return root;
		
	TreeNode* left =  lowestCommonAncestor(root->left, p, q);
	TreeNode* right = lowestCommonAncestor(root->right, p, q);
	
	if(left == NULL)
		return right;
	if(right == NULL)
		return left;      
	if(left && right) // p和q在两侧
		return root;
	return NULL; // 必须有返回值
//作者:Wilson79
//链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/solution/c-jing-dian-di-gui-si-lu-fei-chang-hao-li-jie-shi-/
}

这是经典的递归思路:
1.如果当前结点 root 等于 NULL,则返回 NULL
(root==NULL适用于大多数题)
2.如果 root 等于 p 或者 q ,那这棵树一定返回 p 或者 q
3.用 left 和 right 保存左右子树的遍历结果(结果不为空,则为祖先之一)
4.left为空,说明结果在right。反之,同理
5.如果 left 和 right 都非空,说明一边一个,因此 root 是他们的最近公共祖先
6.如果 left 和 right 都为空,则返回空(到尾或者找不到)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值