二叉树的数据结构定义:
<span style="font-size:14px;">/* binary tree define */
struct TNode;
typedef struct TNode *BinaryTree;
struct TNode
{
ElementType elem;
BinaryTree left, right;
};</span>
Question One: 设计算法求二叉树的叶子节点数目
<span style="font-size:14px;">unsigned leafNodeNum(BinaryTree tree)
{
if (!tree)
return 0;
else
if (!tree->left && !tree->right)
return 1;
else
return leafNodeNum(tree->left) + leafNodeNum(tree->right);
}</span>
Question Two: 设计算法求二叉树的所有节点数目<span style="font-size:14px;">unsigned TreeNodeNum(BinaryTree tree)
{
if (!tree)
return 0;
else
return TreeNodeNum(tree->left) + TreeNodeNum(tree->right) + 1;
}</span>
Question Three: 设计算法求二叉树的树高
<span style="font-size:14px;">int HeightOfTree(BinaryTree tree)
{
if (!tree)
return 0;
int heightOfLeft = HeightOfTree(tree->left);
int heightOfRight = HeightOfTree(tree->right);
return (heightOfLeft > heightOfRight ? heightOfLeft : heightOfRight) + 1;
}</span>
Question Four: 设计算法交换二叉树的每个结点的左右子树
<span style="font-size:14px;">void SwapLeftAndRight(BinaryTree tree)
{
BinaryTree tmpCell;
if (!tree)
return;
SwapLeftAndRight(tree->left);
SwapLeftAndRight(tree->right);
tempCell = tree->left;
tree->left = tree->right;
tree->right = tmpCell;
}</span>
Question Five: 设计算法判断两棵二叉树相同<span style="font-size:14px;">bool EqualTree(BinaryTree tree1, BinaryTree tree2)
{
if (!tree1 && !tree2)
return true;
else
if (!tree1 || !tree2 || tree1->elem != tree2->elem)
return false;
else
return EqualTree(tree1->left, tree2->left) &&
EqualTree(tree1->right, tree2->right);
}</span>
Qustion Six: 设计算法判断二叉树是否为查找二叉树
<span style="font-size:14px;">/* 该算法使用二叉排序树中序遍历有序的性质 */
void JudgeSearchTree(BinaryTree tree, int &valueOfNode, bool &flag)
{
if (tree)
{
JudgeSearchTree(tree->left, valueOfNode, flag);
if (valueOfNode > tree->element)
flag = false;
valueOfNode = tree->element;
JudgeSearchTree(tree->right, valueOfNode, flag);
}
}
/* 该算法根据二叉树排序树的性质直接判断是否为二叉排序树 */
bool JudgeSearchTree(BinaryTree tree)
{
if (!tree)
return true;
if (tree->left && tree->left->element > tree->element)
return false;
if (tree->right && tree->right->element < tree->element)
return false;
return JudgeSearchTree(tree->left) && JudgeSearchTree(tree->right);
}</span>