URL
题目
分析
源码
工程结构
.
└── main_0406.c
源码文件
/* main_0406.c */
#include <stdio.h>
#include <stdlib.h>
#define NULL_NODE (-1)
typedef struct tree_node {
struct tree_node * left;
struct tree_node * right;
int val;
}TREE_NODE;
typedef struct {
struct tree_node * node;
int used;
}RET;
typedef struct element_node{
struct tree_node * val;
struct element_node * next;
}ELEMENT_NODE;
RET create_tree(const int * p, int size)
{
if (size == 0){
return (RET){NULL, 0};
}
if (p[0] == NULL_NODE){
return (RET){NULL, 1};
}
struct tree_node * node = (struct tree_node *)malloc(sizeof(struct tree_node));
node->val = p[0];
RET left = create_tree(p + 1, size - 1 );
RET right = create_tree(p + 1 + left.used, size - 1 - left.used );
node->left = left.node;
node->right = right.node;
return (RET){
node, 1 + left.used + right.used
};
}
void display_tree(struct tree_node * tree)
{
if (tree == NULL){
printf("null ");
return ;
}
printf("%d ", tree->val);
display_tree(tree->left );
display_tree(tree->right );
}
struct tree_node * inorder_successor(struct tree_node * root, struct tree_node * p)
{
struct tree_node * successor = NULL;
if (p->right != NULL){
successor = p->right;
while(successor->left != NULL){
successor = successor->left;
}
return successor;
}
struct tree_node * node = root;
while(node != NULL){
if(node->val > p->val){
successor = node;
node = node->left;
}else{
node = node->right;
}
}
return successor;
}
int main()
{
#if 1
/*
2
/ \
1 3
*/
const int data_arr[] = {2,1,NULL_NODE,NULL_NODE,3,NULL_NODE,NULL_NODE};
struct tree_node p = {
.left = NULL,
.right = NULL,
.val = 1
};
#else
/*
5
/ \
3 6
/ \
2 4
/
1
*/
const int data_arr[] = {5,3,2,1,NULL_NODE,4,NULL_NODE,NULL_NODE,6,NULL_NODE,NULL_NODE};
struct tree_node p = {
.left = NULL,
.right = NULL,
.val = 6
};
#endif
int size = sizeof(data_arr)/sizeof(data_arr[0]);
/* init tree node */
RET ret = create_tree(data_arr, size);
struct tree_node * root = ret.node;
/* dispaly */
printf("tree: ");
display_tree(root);
printf("\n");
/* find */
struct tree_node * node = inorder_successor(root, &p);
if (node != NULL ){
printf("%d \n",node->val);
}else{
printf("null\n");
}
return 0;
}
LOG参考
tree: 2 1 null null 3 null null
2
tree: 5 3 2 1 null 4 null null 6 null null null null
null
源码概述
前提证明:
后继节点的节点值大于 pp 的节点值;
后继节点是节点值大于 pp 的节点值的所有节点中节点值最小的一个节点。
- 左右子树找极值
小结
- 二叉搜索数性质:二叉搜索数中序遍历单调递增