您的位置:首页 > 其它

二叉树题目整理(一)

2016-12-01 22:00 309 查看
二叉树节点定义
struct BinaryTreeNode

{

    int m_nValue;

    BinaryTreeNode* m_pLeft;

    BinaryTreeNode* m_pRight;
};

1、求二叉树中的节点个数

递归解法: 

(1)如果二叉树为空,节点个数为0 

(2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1 

参考代码如下:

int GetNodeNum(BinaryTreeNode * pRoot)

{

    if(pRoot == NULL) // 递归出口

        return 0;

    return GetNodeNum(pRoot->m_pLeft) + GetNodeNum(pRoot->m_pRight) + 1;

}


2、求二叉树的深度

递归解法: 

(1)如果二叉树为空,二叉树的深度为0 

(2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1 

参考代码如下:

int GetDepth(BinaryTreeNode * pRoot)

{

    if(pRoot == NULL) // 递归出口

        return 0;

    int depthLeft = GetDepth(pRoot->m_pLeft);

    int depthRight = GetDepth(pRoot->m_pRight);

    return depthLeft > depthRight ? (depthLeft + 1) : (depthRight + 1); 

}


3、前序遍历,中序遍历,后序遍历

前序遍历递归解法: 

(1)如果二叉树为空,空操作 

(2)如果二叉树不为空,先访问根节点,然后遍历左子树,再遍历右子树 

参考代码如下:

void PreOrderTraverse(BinaryTreeNode * pRoot)

{

    if(pRoot == NULL)

        return;

    printf("%d\n",pRoot->data); // 显示结点数据

    PreOrderTraverse(pRoot->m_pLeft); // 前序遍历左子树

    PreOrderTraverse(pRoot->m_pRight); // 前序遍历右子树

}

中序遍历递归解法 

(1)如果二叉树为空,空操作。 

(2)如果二叉树不为空,先遍历左子树,然后访问根节点,再遍历右子树 

参考代码如下:

void InOrderTraverse(BinaryTreeNode * pRoot)

{

    if(pRoot == NULL)

        return;

    InOrderTraverse(pRoot->m_pLeft); // 中序遍历左子树

    printf("%d\n",pRoot->data); // 显示结点数据

    InOrderTraverse(pRoot->m_pRight); // 中序遍历右子树

}

后序遍历递归解法 

(1)如果二叉树为空,空操作。 

(2)如果二叉树不为空,先遍历左子树,然后遍历右子树,访问根节点 

参考代码如下:

void InOrderTraverse(BinaryTreeNode * pRoot)

{

    if(pRoot == NULL)

        return;

    InOrderTraverse(pRoot->m_pLeft); // 后序遍历左子树

    InOrderTraverse(pRoot->m_pRight); // 后序遍历右子树

    printf("%d\n",pRoot->data); // 显示结点数据

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: