二叉树的常用操作

  1. 二叉树的构建:
    递归构建
    层次构建
  2. 二叉树的遍历
    先序遍历
    后序遍历
    中序遍历
  3. 深度
    最大深度 (递归、层次遍历)
    最小深度 (广度优先搜索)
  4. 节点统计
    总节点数
    叶子节点数
/*
10 6 14 0 0 12 16 8 0 0 0 0 0
3 9 20 0 0 15 7 0 0 0 0
1 2 3 4 5 6 7 0 0 0 0 0 0 0 0 0 0
*/

#include <iostream>
#include <queue>

using namespace std;
typedef struct BTreeNode {
	int data;
	BTreeNode* left;
	BTreeNode* right;
	BTreeNode(int x) : data(x), left(nullptr), right(nullptr) {}
}*BiTree;

//递归构建
void build_tree(BiTree &root) {
	int data;
	cin >> data;
	if (data == 0) {
		root = nullptr;
	}
	else {
		root = new BTreeNode(data);
		//cout << root->data << endl;
		build_tree(root->left);
		build_tree(root->right);
	}
}

int getdata() {
	int data;
	cin >> data;
	return data;
}

//层次构建
void make_tree(BiTree& root) {
	int data = getdata();
	if (data == 0) {
		return;
	}
	root = new BTreeNode(data);
	
	queue<BiTree> Q_tree;
	Q_tree.push(root);
	while (!Q_tree.empty()) {
		BiTree temp = Q_tree.front();
		Q_tree.pop();
		data = getdata();
		if (data != 0) {
			temp->left = new BTreeNode(data);
			Q_tree.push(temp->left);
		}
		data = getdata();
		if (data != 0) {
			temp->right = new BTreeNode(data);
			Q_tree.push(temp->right);
		}
	}
}

//先序遍历
void PreOrderTraverse(BiTree root)
{
	if (root == nullptr)
		return;
	cout << root->data << " ";	//显示节点数据
	PreOrderTraverse(root->left);
	PreOrderTraverse(root->right);
}
//中序遍历
void InOrderTraverse(BiTree root) {
	if (root == nullptr)
		return;
	InOrderTraverse(root->left);
	cout << root->data << " ";
	InOrderTraverse(root->right);
}
//后序遍历
void PostOrderTraverse(BiTree root) {
	if (root == nullptr)
		return;
	InOrderTraverse(root->left);
	InOrderTraverse(root->right);
	cout << root->data << " ";
}

//节点个数
int numberOfNode(BiTree root) {
	if (root == nullptr) {
		return 0;
	}
	return 1 + numberOfNode(root->left) + numberOfNode(root->right);
}

//叶子节点个数
int numberOfLeaf(BiTree root) {
	if (root == nullptr) return 0;
	if (root->left == nullptr && root->right == nullptr) {
		return 1;
	}
	return numberOfLeaf(root->left) + numberOfLeaf(root->right);
}

//最小高度
int min_depth(BiTree root) {
	if (root == nullptr) {
		return 0;
	}
	int depth = 1;
	BiTree end = root;
	queue<BiTree> Q;
	Q.push(root);
	while (!Q.empty()) {
		BiTree temp = Q.front();
		if (temp->left == nullptr && temp->right == nullptr) {
			break;
		}
		if (temp->left != nullptr) {
			Q.push(temp->left);
		}
		if (temp->right != nullptr) {
			Q.push(temp->right);
		}
		if (temp == end) {
			end = temp->right != nullptr ? temp->right : temp->left;
			depth++;
		}
		Q.pop();
	}
	return depth;
}

//最大高度, 递归
int max_depth(BiTree root) {
	if (root == nullptr) return 0;
	return 1 + max(max_depth(root->left), max_depth(root->right));
}

//最大高度, 层次遍历
int max_depth_BFS(BiTree root) {
	if (root == nullptr) {
		return 0;
	}
	int depth = 0;
	queue<BiTree> Q;
	Q.push(root);
	while (!Q.empty()) {
		int cur = 0, width = Q.size();
		while (cur < width) {
			BiTree temp = Q.front();
			if (temp->left != nullptr) Q.push(temp->left);
			if (temp->right != nullptr) Q.push(temp->right);
			Q.pop();
			cur++;
		}
		depth++;
	}
	return depth;
}


int main() {
	BiTree root = nullptr;
	make_tree(root);
	cout << "builded" << endl;

	cout<<"numberOfNode : "<<numberOfNode(root)<<endl;

	cout<<"numberOfLeaf : "<< numberOfLeaf(root)<<endl;

	cout << "PreOrderTraverse : ";
	PreOrderTraverse(root);
	cout << endl;

	cout << "InOrderTraverse : ";
	InOrderTraverse(root);
	cout << endl;

	cout << "PostOrderTraverse : ";
	PostOrderTraverse(root);
	cout << endl;

	cout<< "min depth: " << min_depth(root) << endl;

	cout<< "max depth: " << max_depth_BFS(root) << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值