您的位置:首页 > 其它

二叉树题目整理

2016-12-02 23:07 267 查看
二叉树节点定义
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); // 显示结点数据

}

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