二叉樹的搜尋和插入操作
阿新 • • 發佈:2019-01-10
今天接觸了二叉查詢樹,萬惡的演算法導論,老是虛擬碼,看了好像懂了,實際自己用原始碼,困難重重?糾結了一個晚上總算是略懂了一點二叉樹;
首先還是來定義一個樹吧!
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; }
嗯,就是這樣了
首先