设二叉树以二叉链表形式存放,用类C语言设计非递归算法判断一棵根结点为T的二叉树是否为二叉排序树。要求不使用已有的算法和栈
时间: 2023-06-12 07:05:15 浏览: 116
二叉树的二叉链表存储表示-C语言数据结构讲义 经典
可以使用 Morris遍历,该遍历算法可以实现不使用栈的二叉树遍历。具体实现如下:
1. 从根节点开始遍历,如果当前节点为空,则返回true。
2. 如果当前节点有左子树,就找到其左子树中的最右节点,将其指向当前节点。
3. 如果当前节点的值小于或等于前驱节点的值,则返回false,否则继续遍历。
4. 如果当前节点有右子树,就将当前节点指向其右子树。
5. 重复步骤1-4,直到遍历完整棵树。
代码实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
bool isValidBST(TreeNode* root) {
TreeNode* pre = NULL;
TreeNode* cur = root;
while (cur != NULL) {
if (cur->left == NULL) {
if (pre != NULL && pre->val >= cur->val) {
return false;
}
pre = cur;
cur = cur->right;
} else {
TreeNode* node = cur->left;
while (node->right != NULL && node->right != cur) {
node = node->right;
}
if (node->right == NULL) {
node->right = cur;
cur = cur->left;
} else {
if (pre != NULL && pre->val >= cur->val) {
return false;
}
pre = cur;
node->right = NULL;
cur = cur->right;
}
}
}
return true;
}
```
该算法的时间复杂度为O(n),空间复杂度为O(1)。
阅读全文