c语言求二叉树中最小值的节点值,在二叉树中找到“局部最小值”

你们可以帮我解决一些我困在功课的问题吗?在二叉树中找到“局部最小值”

完整二叉树中的局部最小值被定义为小于其所有邻居(邻居=父亲,左孩子,右孩子)的节点。 我需要在给定的完整二叉树中找到一个局部最小值,它的每个节点在O(logn)complixity时间中有一个不同的数字。那么,由于需求是O(logn),我试图想出一种方法,只能通过树中的一条路径到达一片叶子。 或者,也许我可以每次只看到一半的树在递归中,这样它就会执行logn。

所以说,我有这样的树:

70

/\

77 60

有3种情况:

1)根比左和右子都较小//然后我做

2)的根是仅比左

3)的根是仅比右 小而变小

上面的树是案例2. 所以让我们“扔掉”左边的子树,因为77没有办法成为“局部最小”,因为它大于它的父亲。 所以我们留下了正确的子树。依此类推,直到我们找到当地的最小值。

问题在于,当我们抛出左子树时,我们可能会错过下面的另一个局部最小值。这里有一个例子:

70

/ \

77 60

/ \ / \

1 8 9 14

/\/\/\ /\

3 4 5 6 2 7 15 13

因此,在这种情况下,唯一的局部最小值为“1”,但我们错过了它,因为在一开始我们决定通过根的右子树进行搜索。

2013-03-27

Alaa M.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于C语言二叉树最小值节点的查找算法实现: ```c #include <stdio.h> #include <stdlib.h> /* 定义二叉树节点结构体 */ typedef struct TreeNode { char val; struct TreeNode *left; struct TreeNode *right; } TreeNode; /* 创建二叉树节点 */ TreeNode* createNode(char val) { TreeNode* node = (TreeNode*) malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } /* 二叉树序遍历查找最小值节点 */ TreeNode* minNode(TreeNode* root) { TreeNode* minP = NULL; TreeNode* p = root; TreeNode* stack[100]; int top = -1; while (p != NULL || top != -1) { if (p != NULL) { stack[++top] = p; p = p->left; } else { TreeNode* node = stack[top--]; if (minP == NULL || node->val < minP->val) { minP = node; } p = node->right; } } return minP; } int main() { /* 创建二叉树 */ TreeNode* root = createNode('5'); root->left = createNode('3'); root->right = createNode('8'); root->left->left = createNode('2'); root->left->right = createNode('4'); root->right->left = createNode('7'); root->right->right = createNode('10'); /* 查找最小值节点 */ TreeNode* minP = minNode(root); printf("The min node value is: %c\n", minP->val); return 0; } ``` 该算法首先定义了二叉树节点的数据结构,然后定义了创建二叉树节点的createNode函数。接着定义了minNode函数,该函数使用序遍历的方式遍历二叉树,并记录最小值节点minP。最后在main函数创建二叉树并调用minNode函数查找最小值节点

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值