二叉樹的常用操作

  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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章