有没有办法实现此二进制搜索树功能?
我正在努力实现以下功能:
给定二进制搜索树,返回最小的节点,然后将指针移至树中下一个最小的节点。再调用函数后,它应该返回下一个最小的节点,依此类推。
任何帮助将不胜感激。
到目前为止,这是我的程序,其中有一些辅助功能及其定义:
#include <stdio.h>
#include <stdlib.h>
/* A binary tree node has data,
the pointer to left child
and a pointer to right child */
struct node {
int data;
struct node *left;
struct node *right;
struct node *parent;
};
struct node *minValue(struct node *node);
struct node *inOrderSuccessor(
struct node *root,
struct node *n)
{
if (n->right != NULL)
return minValue(n->right);
struct node *p = n->parent;
while (p != NULL && n == p->right) {
n = p;
p = p->parent;
}
return p;
}
/* Given a non-empty binary search tree,
return the minimum data
value found in that tree. Note that
the entire tree does not need
to be searched. */
struct node *minValue(struct node *node)
{
struct node *current = node;
/* loop down to find the leftmost leaf */
while (current->left != NULL) {
current = current->left;
}
return current;
}
/* Helper function that allocates a new
node with the given data and
NULL left and right pointers. */
struct node *newNode(int data)
{
struct node *node = (struct node *)malloc(sizeof(struct node));
node->data = data;
node->left = NULL;
node->right = NULL;
node->parent = NULL;
return (node);
}
/* Give a binary search tree and
a number, inserts a new node with
the given number in the correct
place in the tree. Returns the new
root pointer which the caller should
then use (the standard trick to
avoid using reference parameters). */
struct node *insert(struct node *node,
int data)
{
/* 1. If the tree is empty, return a new,
single node */
if (node == NULL)
return (newNode(data));
else {
struct node *temp;
/* 2. Otherwise, recur down the tree */
if (data <= node->data) {
temp = insert(node->left, data);
node->left = temp;
temp->parent = node;
} else {
temp = insert(node->right, data);
node->right = temp;
temp->parent = node;
}
/* return the (unchanged) node pointer */
return node;
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
以下是有关您的代码的一些评论:
函数
minvalue
是正确的,它应该接受null参数(这是一个空的树)并为此返回null。功能
new_node
应检查内存分配未能避免不确定的行为。函数
inorderSuccessor
在返回到root
节点时,应停止扫描,并返回null
。还测试无效的父节点将避免不确定的行为。您可以在
插入
中检查失败并返回空指针。这是一个具有功能测试的修改版本:
输出:
Here are some remarks about your code:
the function
minValue
is correct, by it should accept a null argument (which is an empty tree) and return null for that.the function
new_node
should check for memory allocation failure to avoid undefined behavior.function
inOrderSuccessor
should stop scanning when it goes back up to theroot
node from its right child and returnNULL
. Also testing for a null parent node will avoid undefined behavior.you can check for failure in
insert
and return a null pointer.Here is a modified version with a functional test:
Output:
min_node()
返回树中的最小节点:usage:
ustage:
next_smallest_node()
现在解析左子树(感谢 @chqrlie )。min_node()
returns the smallest node in a tree:Usage:
Update:
next_smallest_node()
now parses the left sub-tree (thanks to @chqrlie).