2020.05.08之算法:二叉樹基礎代碼的練習

三種遍歷,求後驅與前驅,判斷二叉搜索樹,判斷二叉平衡樹,判斷完全二叉樹,求完全二叉樹的個數

#include <iostream>
#include <vector>
#include <stack>
#include <math.h>
#include <algorithm>
#include <queue>
using namespace std;

struct Node{
	Node *left=NULL;
	Node *right=NULL;
	int val;
	Node(int val) :left(NULL), right(NULL), val(val) {}
};
vector<int> preorder(Node* root) {
	vector<int> res;
	if (root == NULL) {
		return res;
	}
	stack<Node*> s;
	s.push(root);
	while (!s.empty()) {
		root = s.top();
		s.pop();
		res.push_back(root->val);
		if (root->right) {
			s.push(root->right);
		}
		if(root->left) {
			s.push(root->left);
		}
	}
	return res;
};
vector<int> Inoreder(Node* root) {
	vector<int> res;
	if (root == NULL) {
		return res;
	}
	stack<Node*> s;
	while (!s.empty() || root != NULL) {
		while (root != NULL) {   //直接求root本身
			s.push(root);
			root = root->left;
		}
		root = s.top();
		s.pop();
		res.push_back(root->val);
		root = root->right;
	}
	return res;
}
//記住主要是判斷當前root

vector<int> afterorder(Node* root) {
	vector<int> res;
	if (root == NULL) {
		return res;
	}
	stack<Node*> s;
	stack<int> sres;
	s.push(root);
	while (!s.empty()) {
		root = s.top();
		s.pop();
		sres.push(root->val);
		if (root->left) {
			s.push(root->left);
		}
		if (root->right) {
			s.push(root->right);
		}
	}
	while (!sres.empty()) {
		res.push_back(sres.top());
		sres.pop();
	}
	return res;

}


//後繼者
struct TreeNode
{
	TreeNode *parent;
	TreeNode *left;
	TreeNode *right;
	int val;
	TreeNode(int val) :val(val), parent(NULL), left(NULL), right(NULL) {}
};
TreeNode* first(TreeNode*p) {
	while (p->left != NULL) {
		p = p->left;
	}
	return p;
}
TreeNode * Successor(TreeNode* root, TreeNode *p) {
	//分爲兩種情況
	//1.p結點有右子樹
	if (p->right != NULL) {
		return first(p->right);
	}
	else {
		TreeNode* parent = p->parent;
		while (parent!=NULL&&parent->left != p) {
			p = parent;
			parent = p->parent;
		}
		return parent;
	}
}

vector<TreeNode*> inoreder(TreeNode* root) {
	vector<TreeNode*> res;
	if (root == NULL) {
		return res;
	}
	stack<TreeNode*> s;
	while (!s.empty() || root != NULL) {
		while (root != NULL) {   //直接求root本身
			s.push(root);
			root = root->left;
		}
		root = s.top();
		s.pop();
		res.push_back(root);
		root = root->right;
	}
	return res;
}
//沒有父節點的情況下
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
	vector<TreeNode*> inordernum = inoreder(root);
	int sz = inordernum.size();
	for (int i = 0; i<sz; i++) {
		if (inordernum[i] == p) {
			if (i == sz - 1) {
				return NULL;
			}
			else {
				return inordernum[i + 1];
			}
		}
	}
	return NULL;
}
TreeNode* first1(TreeNode* p) {
	while (p->right != NULL) {
		p = p->right;
	}
	return p;
}

//前驅結點
TreeNode* Successor1(TreeNode* root, TreeNode *p) {
	//分爲兩種情況
	//1.p結點有左子樹
	if (p->left != NULL) {
		return first1(p->left);
	}
	else {
		TreeNode* parent = p->parent;
		while (parent != NULL&&parent->right != p) {
			p = parent;
			parent = p->parent;
		}
		return parent;
	}
}

//判斷一棵樹是否是平衡二叉樹
int TreeNodeHeight(TreeNode* root) {
	if (root == NULL) {
		return 0;
	}
	return max(TreeNodeHeight(root->left), TreeNodeHeight(root->right)) + 1;
}
bool isBalanced(TreeNode* root) {
	if (root == NULL) {
		return true;
	}
	else {
		if(abs(TreeNodeHeight(root->left)-TreeNodeHeight(root->right))>1){
			return false;
		}
		else {
			return isBalanced(root->left) && isBalanced(root->right);
		}
	}
}

//判斷是否是一個BST

bool isValidBST(TreeNode* root) {
	//特性就是二叉搜索樹的中序遍歷是一個遞增的數組
	if (root == NULL) {
		return true;
	}
	stack<TreeNode*> s;
	TreeNode * pre = NULL;
	int i = 0;
	while (!s.empty() || root != NULL) {
		while (root != NULL) {
			s.push(root);
			root = root->left;
		}
		root = s.top();
		s.pop();
		if (pre != NULL&&pre->val >= root->val) return false;
		pre = root;
		root = root->right;
	}

}
//判斷CST
bool isCompleteTree(TreeNode* root) {
	if (root == NULL) {
		return true;
	}
	queue<TreeNode*> qt;
	qt.push(root);
	bool state = false;
	TreeNode* l;
	TreeNode* r;
	while (!qt.empty()) {
		root = qt.front();
		qt.pop();
		l = root->left;
		r = root->right;
		if ((state && (l != nullptr || r != nullptr)) || (l == nullptr && r != nullptr)) return false;
		if (l != nullptr) {
			qt.push(l);
		}
		if (r != nullptr) {
			qt.push(r);
		}
		else {
			state = true;
		}
		
	}
	return true;
		
}

//求完全二叉樹的個數
//第一步要求出高度,這個完全二叉樹的高度
//再查看下右子樹是不是等於這個高度
int CTSHeight(TreeNode * root,int level) {
	//int level = 0;
	while(root != nullptr) {
		level++;
		root = root->left;
	}
	return level-1;
}
int bs(TreeNode* root, int l, int h) {
	if (l == h) {
		return 1;
	}
	if (CTSHeight(root->right, l + 1) == h) {
		return (1 << (h - l)) + bs(root->right, l + 1, h);
	}
	else {
		return(1 << (h - l-1)) + bs(root->left, l + 1, h);
	}

}
int countNodes(TreeNode* root) {
	if (root == nullptr) {
		return 0;
	}
	return bs(root, 1, CTSHeight(root, 1));
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章