二叉树的介绍
- 二叉树是一棵树,其中每个节点的儿子数至多为两个(儿子数的范围是[0,2] )
- 二叉树的一个性质是平均二叉树的深度要比N小得多,平均深度为O(
根号N),但是在最坏得情况下深度可以达到N-1
二叉树的实现
二叉树节点的声明为:
typedef struct TreeNode *Tree;
struct TreeNode{
ElementType Element;
Tree Left;
Tree Right;
}
二叉树的一些应用
构建表达树:一棵表达树是这样的:叶节点都是操作数,其他树节点是操作符。我们把后缀表达式构建成一棵表达树是这样子的:我们一次一个符号的读入表达式,如果符号是操作数,那么我们就建立一个单节点树并将指向它的一个指针压入栈中,如果符号是操作符,那么我们就从栈中弹出指向两颗树的指针并形成一棵新的树,然后再将指向该树的指针压入到栈中
typedef struct TreeNode *Tree;
struct TreeNode {
char element;
Tree Left;
Tree Right;
};
//栈的声明
struct Stack {
Tree* val;
int top;
};
//构建表达树(后缀表达式)
Tree CreateTree(string s) {
int i = 0;
Stack* ens=CreateStack(s.length());
while (s[i] != '\0') {
if (s[i] == '+' || s[i] == '*' || s[i] == '-' || s[i] == '/') {
Tree ch1 = new TreeNode;
ch1->element = s[i];
//因为操作符都是二元操作符,故在栈中必存在至少两个元素
ch1->Left = ens->val[ens->top--];//弹出栈顶元素,作为表达树的左子树
ch1->Right = ens->val[ens->top]; //弹出栈顶元素,作为表达树的右子树
ens->val[ens->top] = ch1; //将表达树压回栈中
}
else {
Tree ch2 = new TreeNode;
ch2->element = s[i];
ch2->Left = NULL;
ch2->Right = NULL;
ens->val[++ens->top] = ch2;
}
i++;
}
return ens->val[ens->top];
}
4872

被折叠的 条评论
为什么被折叠?



