二叉树的三种遍历及求高度和非叶子节点(递归实现)

二叉树的三种遍历

简介

  • 先序遍历:先访问根节点——左子树——右子树
  • 中序遍历:先访问左子树——根节点——右子树
  • 后序遍历:先访问左子树——右子树——根节点

例如

在这里插入图片描述

  • 先序遍历结果: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;
}

猜你喜欢

转载自blog.csdn.net/streamery/article/details/103034175