二叉搜尋樹是指具有以下性質的二叉樹:二叉搜尋樹執行各種操作的時間複雜度與樹的高度成正比,而線性鍊錶的操作則與鍊錶長度成正比。因此,對於有相同結點數的二叉搜尋樹和鍊錶,樹的操作花費代價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 解釋 輸入為 ...