1. 程式人生 > >二叉樹的搜尋和插入操作

二叉樹的搜尋和插入操作

今天接觸了二叉查詢樹,萬惡的演算法導論,老是虛擬碼,看了好像懂了,實際自己用原始碼,困難重重?糾結了一個晚上總算是略懂了一點二叉樹;

首先還是來定義一個樹吧!大笑

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;
}

嗯,就是這樣了

首先