🎋二叉树的基本操作
一、树的节点个数
1.所有节点个数
size_t getAllNodesNumber(Node* node) {
    size_t cur=0;
	if (!node) return 0;
    cur=1;
	size_t left =  getAllNodesNumber(node->lchild);
	size_t right = getAllNodesNumber(node->rchild);
			
	return left + right + cur;//左子树+右子树+根
}2.叶子节点个数
叶子节点是度为0的节点。也就是没有孩子节点。
size_t getLeafNodesNumber(Node* node) {
	size_t cur = 0;
	if (!node)return 0;
	if (!node->lchild && !node->rchild)cur=1;
	size_t left = getAllNodesNumber(node->lchild);
	size_t right = getAllNodesNumber(node->rchild);
	return cur + left + right;
}3.分支节点个数
分支节点是度不为0的节点。也就是有孩子节点存在
size_t getBranchNodesNumber(Node* node) {
	size_t cur = 0;
	if (!node)return 0;
	if (node->lchild || node->rchild)cur = 1;
	size_t left = getAllNodesNumber(node->lchild);
	size_t right = getAllNodesNumber(node->rchild);
	return cur + left + right;
}4.满度节点个数
二叉树满度也就是节点的度为2。也就是左右孩子都存在。
size_t getFullNodesNumber(Node* node) {
	size_t cur = 0;
	if (!node)return 0;
	if (node->lchild && node->rchild)cur = 1;
	size_t left = getAllNodesNumber(node->lchild);
	size_t right = getAllNodesNumber(node->rchild);
	return cur + left + right;
}二、遍历时显示层号
在节点结构中加入层号属性。结果容器由vector<int>:res改为multimap<int,int>:m
struct TreeNode {
    int id;
	int val;
	TreeNode* lchild, * rchild;
	TreeNode():id(0),val(0),lchild(nullptr),rchild(nullptr){}
	TreeNode(const int& _val):id(0),val(_val),lchild(nullptr),rchild(nullptr){}	
};使用层序遍历:
void Tree::levelTraverse() {
	m = {};//遍历前将容器清空
	queue<Node*> que;
	Node* cur = root;
    cur->id=1;//根节点为第一层
	que.push(cur);
	while (!que.empty()) {
		Node* front = que.front();
		que.pop();
		m.insert( {front->id,front->val} );
		if (front->lchild){
            front->lchild->id = front->id+1;//入队前,序号为父节点层号加1,
            que.push(front->lchild);
        }
		if (front->rchild){
            front->rchild->id = front->id+1;//入队前,序号为父节点层号加1,
            que.push(front->rchild);
        }
	}
}输出时,输出m.first和m.second即可将层号和节点值同时打印出来
三、输出第 i 层节点
在 二 的基础上,输出时,如果m.first == i,输出。
或者将代码改为:(插入时直接判断)
void Tree::levelTraverse(int i) {
	m = {};//遍历前将容器清空
	queue<Node*> que;
	Node* cur = root;
    cur->id=1;//根节点为第一层
	que.push(cur);
	while (!que.empty()) {
		Node* front = que.front();
		que.pop();
		if(front->id == i)m.insert( {i,front->val} );
		if (front->lchild){
            front->lchild->id = front->id+1;//入队前,序号为父节点层号加1,
            que.push(front->lchild);
        }
		if (front->rchild){
            front->rchild->id = front->id+1;//入队前,序号为父节点层号加1,
            que.push(front->rchild);
        }
	}
}四、获取树的高度(深度)
最简单的方法就是在上面的基础上,输出m的最后一个元素的first属性值。
int getHeight(){
    return m.rbegin()->fisrt;
}🎄二叉树的Leetcode习题练习
100. 相同的树 - 力扣(LeetCode)
101. 对称二叉树 - 力扣(LeetCode)
226. 翻转二叉树 - 力扣(LeetCode)
LCR 174. 寻找二叉搜索树中的目标节点 - 力扣(LeetCode)
114. 二叉树展开为链表 - 力扣(LeetCode)









