二叉搜尋樹學習

2021-06-22 09:56:54 字數 2416 閱讀 9411

二叉搜尋樹是指具有以下性質的二叉樹:

1. 其父節點的左孩子一定大於父節點,右孩子一定小於父節點

2. 具有普通二叉樹的性質

二叉搜尋樹執行各種操作的時間複雜度與樹的高度成正比,而線性鍊錶的操作則與鍊錶長度成正比。因此,對於有相同結點數的二叉搜尋樹和鍊錶,樹的操作花費代價

小於鍊錶,但實現略複雜於鍊錶。

下面是二叉樹的一些基本操作,其中,插入、遍歷、最大最小等比較簡單,刪除某個結點稍微有點複雜:

#include #include #include typedef char type_value;

typedef struct btsnodebtsnode;

//遞迴實現插入

void btsnodeinsert(btsnode **p, char cvalue)

else if( cvalue < (*p)->data)

else }

//非遞迴插入

void btsnodeinsert2(btsnode **root, type_value value)

else p = p->rchild;

} if(parent == null)

else if (parent->data > value)

else }

void preorder(btsnode *root)

}void inorder(btsnode *root)

}bool searchnode(btsnode *root, type_value value)//遞迴

else if (value == root->data)

else if(value < root->data) else if(value > root->data)

}bool searchnode2(btsnode *root, type_value value)//非遞迴

else if (value < p->data)

else if(value > p->data)

}printf("找不到\n");

return false;

}bool deletenode(btsnode *root, type_value v)

btsnode *ptemp = root;

btsnode *parent = null;

while(ptemp != null)

else if(ptemp->data < v)

else if(ptemp->data > v)

}if(ptemp == null)

//如果被刪結點是葉子,直接釋放即可

if(ptemp->lchild == null && ptemp->rchild == null)

else if(parent->lchild == ptemp)

else

free(ptemp);

} //被刪結點為單支子樹的根,讓其父節點與其子樹相連,釋放被刪節點

else if(ptemp->lchild == null || ptemp->rchild == null)

else if(ptemp->rchild != null)

} else

else if(parent->lchild == ptemp && ptemp->rchild)

else if(parent->rchild == ptemp && ptemp->lchild)

else if(parent->rchild == ptemp && ptemp->rchild)

free(ptemp);

} }//被刪結點左右子樹均不為空

else

ptemp->data = q->data; //直接把前驅節點的值賦給被刪節點

if(p == ptemp)

else

free(q); //刪除前驅(相當於刪除被刪節點)

} return true;

}int main()

; btsnode *root = null;

for(int i=0; i<8; i++)

preorder(root);

printf("\n");

inorder(root);

searchnode2(root,'c');

searchnode2(root,'m');

deletenode(root, 'c');

inorder(root);

btsnodeinsert(&root,'c');

inorder(root);

deletenode(root,'m');

}

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...

二叉搜尋樹 修剪二叉搜尋樹

第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...