检测二叉查找树节点的情况

摘要:提供递归与非递归的思路来查询二叉查找树叶子的数目,节点的数目;值得注意的是非递归的思路是用一个栈来模拟递归,保存相应的节点.

#include "stdafx.h"
#include "stdlib.h"
#include "malloc.h"
typedef  struct TreeRecord *Position;
struct TreeRecord 
{
    int Element;
    Position Left;
    Position Right;
};
Position Insert(Position T,int X)
{
    if (T == NULL)
    {
        T = (Position)malloc(sizeof(TreeRecord));
        T->Element = X;
        T->Left = NULL;
        T->Right = NULL;
        return T;
    }

    if (X > T->Element)
        T->Right = Insert(T->Right,X);
    else if (X<T->Element)
        T->Left = Insert(T->Left,X);
    return T;
}
/*int Compute_NodesNumber(Position T)
{
    //递归的思路
    int number ;
    if (T == NULL)
    return 0;
        number = 1;
        number += Compute_NodesNumber(T->Right);
        number += Compute_NodesNumber(T->Left);

        return number;
}
*/
int Compute_NodesNumber(Position T)
{
    //非递归
    int number = 0,top = -1;
    Position Array[100];
    if (T == NULL)
        return 0;
    do
    {
        number++;
        if (T->Left ==NULL)
        {
            if (top == -1)
            break;//用来判断root的左子树为空
            T = Array[top--];
            T = T->Right;
        }
        else
        {
            Array[++top] = T;
            T = T->Left;
        }
    }while(top!=-1);
        do
    {
        number++;
        if (T->Right ==NULL)
        {
            if (top == -1)
            break;//用来判断root的右子树为空
            T = Array[top--];
            T = T->Left;
        }
        else
        {
            Array[++top] = T;
            T = T->Right;
        }
    }while(top!=-1);
    return number-1;//减掉多算的root
}
int Computeleaf(Position T)
{
    //非递归计算leaf,基本思路一致  
    int number = 0,top = -1;
    Position Array[100];
    if (T == NULL)
        return 0;
    do
    {
        if (T->Left == NULL&&T->Right ==NULL)
        number++;
        if (T->Left ==NULL)
        {
            if (top == -1)
            break;//用来判断root的左子树为空
            T = Array[top--];
            T = T->Right;
        }
        else
        {
            Array[++top] = T;
            T = T->Left;
        }
    }while(top!=-1);

        do
    {
        if (T->Left == NULL&&T->Right ==NULL)
        number++;
        if (T->Right ==NULL)
        {
            if (top == -1)
            break;//用来判断root的右子树为空
            T = Array[top--];
            T = T->Left;
        }
        else
        {
            Array[++top] = T;
            T = T->Right;
        }
    }while(top!=-1);
    return number;//减掉多算的root
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int number;
    Position T = NULL;
    for (int i = 1;i<=10;i+=2)
        T = Insert(T,i);
    for (int i = 2;i<=10;i+=2)
        T = Insert(T,i);
    number = Compute_NodesNumber(T);
    number = Computeleaf(T);
    return 0;
}

你可能感兴趣的:(检测二叉查找树节点的情况)