今天接触了二叉查找树,万恶的算法导论,老是伪代码,看了好像懂了,实际自己用源代码,困难重重?纠结了一个晚上总算是略懂了一点二叉树;
首先还是来定义一个树吧!
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x), left(NULL), right(NULL){}
};
没错,确实是没有父亲指针的
查找
首先先来解决查找问题,查找应该是二叉查找树中最为简单的操作了
思路解析:
1.如果查找节点的val值与value值相等,则返回该节点;
2.如果查找节点的val值大于value值,则查找该节点的左子树;
3.如果查找节点的val值小于value值,则查找该节点的右子树;
思路是清晰的,过程是痛苦的
TreeNode* TreeSearch(int val, TreeNode* root)
{
TreeNode* cur = root//定义根节点
while (cur)
{
if (cur->val == val)
{
return cur;
}
else if(cur->val > val) //找左子树
{
return cur = cur->left;
}
else
{
return cur = cur->right;
}
}
return cur;//返回要寻找的节点
}
插入
思想解析:从根节点一直往下查找,过程一直记录当前节点的父节点(关键),最后完成插入操作,代码如下:
TreeNode* TreeInsert(int val, TreeNode* root)
{
TreeNode* cur = root//定义根节点
TreeNode* parent = NULL;//定义当前节点的父节点
while (cur)
{
parent = cur;//记录当前节点的父节点
if (cur->val == val)
return val;
if (cur->val > val)
cur = cur=>left;
else
cur = cur->right;
}
TreeNode* newNode = new TreeNode(val);
if (NULL != parent) //判断是否为飞空树
{
if (parent->val > val)
{
parent->left = newNode;
}
else
{
parent->right = newNode;
}
}
return newNode;
}
嗯,就是这样了
首先