二叉排序树-非递归形式 C语言

在这里插入图片描述
完整代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct BiTNode
{
	int data;//二叉树数据域 
	struct BiTNode *lchild,*rchild;//二叉树指针域 
}BiTNode,*BiTree;

void InitTree(BiTree &T)//初始化二叉树 
{
	T = (BiTNode*)malloc(sizeof(BiTNode));//创建一个头结点 
	T->data = NULL;
	T->lchild = T->rchild = NULL;//头结点指针域和数据域都NULL 
}

void CreateTree(BiTree &T)//创建排序二叉树 
{
	int a;
	printf("请输入数: ") ; 
	scanf("%d",&a);//输入数据 
	T->data = a;//类似于链表结点的赋值 
	BiTree p = T;
	if(getchar()=='\n')
		return ;
	while(1)
	{
		scanf("%d",&a);//输入要二叉树数据 
		BiTree s;
		s = (BiTNode *)malloc(sizeof(BiTNode));//创建一个结点 
		s->lchild = s->rchild = NULL;//对这个结点进行初始化 
		s->data = a;
		while(1)
		{
			if(s->data > p->data)//判断s中的数据是否大于p中的数据,大于在右,小于在左 
				if(p->rchild != NULL)//如果p的右孩子不空,p往右孩子转移 
					p = p->rchild;
				else//否则p的右孩子接上s 
				{
					p->rchild = s;
					break;//死循环终止条件 
				}	
			else//大于在右,小于在左
				if(p->lchild != NULL)//如果p的左孩子不空,p往左孩子转移 
					p = p->lchild;
				else
				{
					p->lchild = s;//否则p的左孩子接上s 
					break;//死循环终止条件
				}
		}
		p = T;//使p重新返回头结点 
		if(getchar()=='\n')//死循环结束条件 
			break;
	}
}

void InOrderTraverse(BiTree T)//遍历二叉树,中序遍历 
{
	if(T)
	{
		InOrderTraverse(T->lchild);
		printf("%d ",T->data);
		InOrderTraverse(T->rchild);
	}
}

int main()
{
	BiTree T;
	InitTree(T);//创建并初始化二叉树 
	CreateTree(T);//创建排序二叉树 
	printf("排序后的结果为: "); 
	InOrderTraverse(T);//遍历并打印二叉树 
	free(T);
	return 0;
}

(完)

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以采用中序遍历的方法来判断一棵二叉树是否为二叉排序树。中序遍历的结果应该是一个递增的序列,如果不是递增的,则不是二叉排序树。 具体实现如下: ```C #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 定义栈结构体 typedef struct Stack { TreeNode *node; struct Stack *next; } Stack; // 创建节点 TreeNode* createNode(int val) { TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 插入节点 TreeNode* insertNode(TreeNode *node, int val) { if (node == NULL) { node = createNode(val); return node; } if (node->val > val) { node->left = insertNode(node->left, val); } else { node->right = insertNode(node->right, val); } return node; } // 创建栈 Stack* createStack() { Stack *stack = (Stack*)malloc(sizeof(Stack)); stack->node = NULL; stack->next = NULL; return stack; } // 入栈 void push(Stack *stack, TreeNode *node) { Stack *newNode = createStack(); newNode->node = node; newNode->next = stack->next; stack->next = newNode; } // 出栈 TreeNode* pop(Stack *stack) { if (stack->next == NULL) { return NULL; } TreeNode *node = stack->next->node; stack->next = stack->next->next; return node; } // 非递归中序遍历 int isBST(TreeNode *root) { if (root == NULL) { return 1; } Stack *stack = createStack(); TreeNode *node = root; int flag = 1; int pre = node->val; while (node != NULL || stack->next != NULL) { while (node != NULL) { push(stack, node); node = node->left; } node = pop(stack); if (node->val < pre) { flag = 0; break; } pre = node->val; node = node->right; } return flag; } // 测试代码 int main() { // 构建二叉树 TreeNode *root = createNode(4); insertNode(root, 2); insertNode(root, 6); insertNode(root, 1); insertNode(root, 3); insertNode(root, 5); insertNode(root, 7); // 判断是否为二叉排序树 int flag = isBST(root); if (flag) { printf("This is a Binary Search Tree.\n"); } else { printf("This is not a Binary Search Tree.\n"); } return 0; } ``` 这里我们使用了一个栈来保存遍历的节点,用一个变量pre来保存上一个节点的值,从而判断是否递增。这个算法的时间复杂度为O(n),空间复杂度为O(h),其中h为树的高度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值