二叉树结构体
typedef struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode() :val(NULL), left(NULL), right(NULL) {};
TreeNode(char x) :val(x), left(NULL), right(NULL) {};
}*BiTree;
二叉排序树的插入
也可通过插入建立二叉排序树
void insert_Tree(BiTree &T, char s) {
if (T == NULL)
{
T = new TreeNode(s);
}
else if (T->val > s)
insert_Tree(T->left, s);
else
insert_Tree(T->right, s);
}
二叉搜索树的高度
int hight(BiTree root) {
if (root == NULL)
return 0;
else if(hight(root->left)> hight(root->right)){
return hight(root->left)+1;
}
else {
return hight(root->right)+1;
}
}
判断二叉树是否是完全二叉树
bool isWtree(BiTree root) {//是否是完全二叉树,只需要观察节点的孩子节点情况即可
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* cur = q.front();
q.pop();
if (cur->left != NULL && cur->right != NULL)//1.孩子节点都有,则压入队列
{
q.push(cur->left);
q.push(cur->right);
}
if (cur->left == NULL && cur->right != NULL)//2.有右孩子,无左孩子不是完全二叉树
return false;
if (cur->left != NULL && cur->right == NULL || cur->left == NULL && cur->right == NULL) {//3.没有孩子。4.有左孩子,无右孩子两种情况判断后续节点是否有孩子,如果有则不是完全二叉树。
if (cur->left != NULL && cur->right == NULL)//有左孩子,无右孩子则先将孩子压入队列
q.push(cur->left);
while (!q.empty()) {
cur = q.front();
if (cur->left == NULL && cur->right == NULL)
q.pop();
else
return false;
}
return true;
}
}
return true;
}
根据由括号表示法的字符串创建二叉树
void CreateBTree(BiTree &b, string str)
{
int length = str.length();
BiTree St[100];
int top = -1;
TreeNode* p=NULL;
b = NULL;
int k;
int n = 0;
while (length--)
{
switch (str[n])
{
case'(':
St[++top] = p;
k = 1;
break;
case')':
top--;
break;
case',':
k = 2;
break;
default:
p = new TreeNode(str[n]);
if (b == NULL)
b = p;
else
{
switch (k)
{
case 1:St[top]->left = p; break;
case 2:St[top]->right = p; break;
}
}
break;
}
n++;
}
}
根据括号表示法将二叉树输出
void print_Tree(TreeNode* root) {
if (root == NULL)
return;
cout << root->val;
if (root->left == NULL && root->right == NULL)
return;
else {
cout << "(";
if (root->left != NULL)
print_Tree(root->left);
cout << ",";
if (root->right->val != NULL)
print_Tree(root->right);
cout << ")";
}
}
将二叉排序树转换为双向链表
BiTree head = NULL;//双向链表的头指针
TreeNode* cur = NULL;//上一次遍历的根节点
void double_Linknode(TreeNode* root) {//根据二叉排序树的性质,中序遍历构造递增的二叉链表
if (root) {
double_Linknode(root->left);
if (cur)cur->right = root;
else
head = root;//如果上次遍历的根节点为空,说明此次遍历的根节点是最左侧节点,是二叉链表的头节点
root->left = cur;
cur = root;//保存上次的根节点
double_Linknode(root->right);
}
}
二叉树的宽度
int width(TreeNode* root) {
queue<TreeNode*>q;
q.push(root);
int maxwidth = 0;
while (!q.empty())//每一次的循环都是遍历一层,因此如果很容易知道树的高度,只需要记录循环几次便可。
{
int width = q.size();
if (maxwidth < width)
maxwidth = width;
for (int i = 0;i < width;i++) {
TreeNode* cur = q.front();
q.pop();
if (cur->left)
q.push(cur->left);
if (cur->right)
q.push(cur->right);
}
}
return maxwidth;
}