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


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

 

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;
 }
}


在C语言,要计算二叉树所有节点小于给定`a`的节点数量,你需要遍历整棵树。如果你有一个结构化的二叉树,比如`TreeNode`类型,包含`value`(节点)和`left`(左子节点)、`right`(右子节点)指针,你可以使用递归的方式来实现这个功能。这里提供一种基本的思路: ```c #include <stdio.h> typedef struct TreeNode { int value; struct TreeNode* left; struct TreeNode* right; } TreeNode; int countNodesLessThan(int a, TreeNode* root) { if (root == NULL) { // 如果到达空节点返回0 return 0; } // 递归检查左子树和右子树 int leftCount = countNodesLessThan(a, root->left); int rightCount = countNodesLessThan(a, root->right); // 判断当前节点是否小于a,然后加上左右子树的结果 if (root->value < a) { return leftCount + rightCount + 1; // 当前节点也包括在内 } else { return leftCount + rightCount; // 当前节点不满足条件 } } // 示例用法 TreeNode* createTree(); // 假设这是创建树的函数 int main() { TreeNode* root = createTree(); int targetValue = 5; // 想要查找小于5的节点 int nodeCount = countNodesLessThan(targetValue, root); printf("Number of nodes with values less than %d: %d\n", targetValue, nodeCount); return 0; } ``` 在这个代码片段,`countNodesLessThan`函数接收一个目标`a`和根节点`root`作为参数。如果节点小于`a`,则增加计数器并继续递归地遍历子树。否则,只递归地访问子树。 注意,你需要根据自己的二叉树数据结构和创建树的方法来调整`createTree()`函数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值