代码随想录 第八章 二叉树:二叉搜索树

纸上得来终觉浅,觉知此事要躬行

二叉搜索树的定义。

若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。

若它的右字树不为空,则右子树上所有节点的值均大于它的根节点的值。

它的左、右子树也分别为二叉搜索树。

二叉搜索树是有序数,这就决定了二叉搜索树的递归遍历、迭代遍历和普通二叉树都不一样。

15、在二叉搜索树中寻找节点

leetcode700:

确定一个节点是否存在二叉搜索树中,如果在,则返回这个节点,如果不在,则返回null。

(1)、递归法

因为二叉搜索树的节点是有序的,所以可以有方向地搜索。如果root->val大于val,则搜索左子树,如果root->val小于val,则搜索右子树,如果没有找到目标节点,则返回null。

#include
using namespace std;

typedef struct _tag_BitNode {
	int data;
	_tag_BitNode* left;
	_tag_BitNode* right;
	_tag_BitNode(int val) {
		data = val;
		left = nullptr;
		right = nullptr;
	}
}BitNode,*BitNodePtr;

BitNode* SearchBST(BitNode* root, int val) {
	if (root == nullptr || root->data == val) {
		return root;
	}
	if (root->data > val) {
		return SearchBST(root->left, val);
	}
	if (root->data < val) {
		return SearchBST(root->right, val);
	}
	return nullptr;
}

void main() {
	BitNode node0(4), node1(2), node2(7);
	BitNode node3(1), node4(3), node5(6), node6(8);
	node0.left = &node1;
	node0.right = &node2;
	node1.left = &node3;
	node1.right = &node4;
	node2.left = &node5;
	node2.right = &node6;

	BitNode* ret = SearchBST(&node0, 3);
	cout << "hell world" << endl;
}

(2)、迭代法

一提到二叉树遍历的迭代法,读者可能立刻想到使用栈模拟深度遍历,使用队列模拟广度遍历。但对于二叉搜索树就不一样了,基于二叉搜索树的特殊性,也就是节点的有序性,不适用辅助栈或者队列就可以写成迭代法。

对于一般二叉树,递归过程中还有回溯的过程。例如,遍历一个左方向的分支到头了,就需要调头,再遍历右分支。而对于二叉搜索树,不需要回溯的过程,基于节点的有序性就可以确定搜索方向。

你可能感兴趣的:(数据结构,算法)