#include<iostream>
#include<stdlib.h>
#include<stack>
using namespace std;
typedef int ElementType;
typedef struct BinTreeNode * NodePtr;
struct BinTreeNode {
ElementType data;
NodePtr left, right;
};
NodePtr Find(NodePtr p, ElementType x) {
while (p) {
if (x < p->data) p = p->left;
else if (x > p->data) p = p->right;
else break;
}
return p;
}
//非递归实现查找最小
NodePtr FindMin(NodePtr p) {
if (p)
while (p->left) p = p->left;
return p;
}
//非递归实现查找最大
NodePtr FindMax(NodePtr p) {
if (p)
while (p->right) p = p->right;
return p;
}
//有最小最大值的节点必定是叶子节点或者只有一个字节点
//注意函数的调用栈的消亡,递归函数的调用栈等等
NodePtr Insert(NodePtr& p, ElementType x) {
//初始化为根节点申请或者为叶子节点申请子节点
if (!p) {
p = (NodePtr)malloc(sizeof(struct BinTreeNode));
p->data = x;
p->left = p->right = nullptr;
}
else {
if (x < p->data) Insert(p->left, x);
else if (x > p->data) Insert(p->right, x);
}
return p;
}
NodePtr Delete(NodePtr& p, ElementType x) {
NodePtr temp;
if (!p) printf("wrong");
else {
if (x < p->data) Delete(p->left, x);
else if (x > p->data) Delete(p->right, x);
else {
if (p->left&&p->right) {
temp = FindMin(p->right);
p->data = temp->data;
p->right = Delete(p->right, x);
}
else {
temp = p;
//只有右孩子或者没有字节点
if (!p->left) p = p->right;
//只有左孩子
else p = p->left;
free(temp);
}
}
}
return p;
}
//二叉树中序遍历的非递归使用,利用堆栈实现回溯
void dfs(NodePtr p) {
stack<NodePtr>s;
while (p || !s.empty()) {
while (p) {
s.push(p); p = p->left;
}
p = s.top(); s.pop();
cout << p->data << ' ';
p = p->right;
}
}
int main() {
NodePtr temp = nullptr;
for (int i = 1; i < 6; i++) Insert(temp, i);
dfs(temp);
}
二叉搜索树
最新推荐文章于 2020-01-03 14:10:54 发布