二叉树的三种遍历
简介
- 先序遍历:先访问根节点——左子树——右子树
- 中序遍历:先访问左子树——根节点——右子树
- 后序遍历:先访问左子树——右子树——根节点
例如
- 先序遍历结果:ABDECF
- 中序遍历结果:DBEAFC
- 后序遍历结果:DEBFCA
代码实现
- 先序遍历:
void preOrder (tree * root){
if(root) {
printf("%c",root->data);
preOrder(root->lchild);
preOrder(root->rchild);
}
}
- 中序遍历
void preOrder (tree * root){
if(root) {
preOrder1(root->lchild);
printf("%c",root->data);
preOrder1(root->rchild);
}
}
- 后序遍历
void preOrder (tree * root){
if(root) {
preOrder2(root->lchild);
preOrder2(root->rchild);
printf("%c",root->data);
}
}
二叉树求高度
思想
采用递归的思想,当其为空时,返回0;当其没有左孩子和右孩子时,返回1;有左孩子或右孩子时对其进行判断
代码实现
int treeHeight(tree* t) {
if(t == NULL)
return 0;
if(t->lchild == NULL && t->rchild == NULL)
return 1;
return max(treeHeight(t->lchild),treeHeight(t->rchild))+1;
}
二叉树求其非叶子节点
思想
非叶子节点就是不是没有孩子的节点。判断其有没有孩子,若有孩子则为非叶子节点,数量+1,再对其孩子进行判断
代码实现
int leaves(tree *t) {
int count = 0;
if (t == NULL) {
return 0;
}
if (t -> lchild != NULL || t -> rchild != NULL) {
count = leaves(t -> lchild);
count += leaves(t -> rchild);
count++;
}
return count;
}