二叉树查找不严格小于一个值的最大值(返回节点)。

查找一个不严格的小于一个值的节点,就是当二叉树中存在这个节点的时候。直接查找出来,当二叉树中不存在这个节点的时候查找比这个节点小的,但是在所有小于所查节点中的最大节点。这个程序中使用了栈进行中序遍历。代码如下:

 

typedef struct BiTNode{
    int data;
    
    struct BiTNode *lchild,*rchild;
}*BiTree;
struct SqList
{
    int elem[200];//将二叉树的节点数值存放到这个数组中,暂时定义数组长度为200
    int length;
};
////////////////////////////////////////////////////////////////////////////
//时间复杂度为O(1),怎么找出一个栈里的最大元素 ,在这里用顺序栈表示,不用链栈
#define  MAX_SIZE 100 //定义初始栈的大小
struct Stack
{
    int data; //存放整形数据数据,没什么作用
    char character;//存放字符,这两个没什么作用
    BiTNode *Tree_Node;
    
    
};
struct qStack
{
    int i;//计算栈中所存数据的个数
    int stack_size;//顺序栈的大小
    Stack *top;
    Stack *base;
};

////////////////////////////////////////////////////////////////////////////
//顺序栈
void IniqStack(qStack &s)
{

    s.i=0;
    s.base=s.top=(Stack*)malloc(sizeof(Stack)*MAX_SIZE);//
    s.stack_size=MAX_SIZE;
}
void Push_Tree(qStack &s,BiTNode *p)
{
    if (s.top-s.base>=s.stack_size)
    {
        s.base=(Stack*)realloc(s.base,(s.stack_size+10));//增加十个空间
        s.top++;//顶部上移
        s.stack_size+=10;
    }

    s.top->Tree_Node=p;
    s.i++;
    s.top++;
}
void Pop_Tree(qStack &s,BiTNode *&p)
{
    if (s.i==0)
    {
        printf("栈为空\n");
    }
    s.top--;
    s.i--;
    p=s.top->Tree_Node;
    s.top->Tree_Node=NULL;
}
bool StackEmpty(qStack s) //判断栈是否为空,
{
    if (s.base==s.top)
    {
        return true;
    }
    else
    {
        return false;
    }
}
///////////////////////////////////////////////////////////////////////////
//二叉树查找不严格小于一个值的最大值
void Serch_point(BiTNode *head,int data,BiTNode *&p,qStack s)
{
    int temp;
    //BiTNode *p;
    p=head;
    temp=p->data; //假定temp的最初值是根节点的大小
    while(p||!StackEmpty(s)) //采用中序遍历,
    {
        if (p)
        {
            Push_Tree(s,p);
            p=p->lchild;
        }
        else
        {
            Pop_Tree(s,p);
            if (data==p->data)
            {
                return; //跳出循环,进入返回p节点
            }else if ((p->data<data)&&(p->data>temp)) //如果在二叉树不存在data,则寻找最大的节点,temp记录小于data的最大节点;
            {
                temp=p->data;
            }

            p=p->rchild;
        }
    }
    Serch_point(head,temp,p,s);//递归调用寻找最大的值,
 if (p->data>data) //如果最后返回的值大于data的值,则说明。data比所有的节点都要小。则p返回null
 {
  p=NULL;
  return;
 }
}


    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/aini201/article/details/8039824
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞