《数据结构》--二叉树【下】

????二叉树的基本操作


一、树的节点个数

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)

上一篇:快速学习Serde包实现rust对象序列化-命名规范


下一篇:【Node-Red】使用文件或相机拍摄实现图像识别