struct TreeNode{
ElemtType val;
TreeNode *left,*right;
};
1.判定一棵二叉树是否是完全二叉树
借助于层次遍历的算法,将所有结点入队列,包括空结点。出队遇到空结点时,查看其后是否有非空结点,若有,则不是完全二叉树。
bool isComplete(TreeNode* root){
TreeNode* Q[MaxSize];
int front = -1, rear = -1;
if (!root)
return true;
Q[++rear] = root;
while (front != rear){
root = Q[++front];
if (root){
Q[++rear] = root->left;
Q[++rear] = root->right;
}
else{
while (front != rear){
root = Q[++front];
if (root)
return false;
}
}
}
return true;
}
2.求先序遍历序列中第K(1<=k <= n)个结点的值。
设置一个引用变量i记录已经访问过的结点的序号,初值设为0。当前二叉树b为空时返回一个特殊字符’#’。当i==k,表示找到满足条件的结点;当i!=k时,则递归地在左子树中查找,若找到返回该值,否则继续递归地在右子树中查找。
ElemType getK(TreeNode* root, int& n,int k){
if (!root)
return ‘#‘;
n++;
if (n == k)
return root->val;
ElemType temp=getK(root->left, n, k);
if (temp != ‘#‘)
return temp;
return getK(root->right, n,k);
}
3.对于二叉树中每一个元素为x的结点,删去以它为根的子树,并释放相应的空间。
删除以元素值x为根的子树,只要能删除其左、右子树,就可以释放值为x的根节点。在后序遍历的基础上进行删除某一结点的左右子树,并将该结点的左右指针设为NULL。
需要注意的是参数为引用值。
void Delete(TreeNode*& root){
if (root){
Delete(root->left);
Delete(root->right);
delete root;
root = NULL;
}
}
void DeleteX(TreeNode*& root, int x){
if (!root)
return;
DeleteX(root->left, x);
DeleteX(root->right, x);
if (root->val == x)
Delete(root);
}
4.在二叉树中查找值为x的结点,打印该结点的所有祖先。假设值为x的结点不多于1个。
采用后序遍历,最后访问根节点,当访问到值为x的结点时,栈中所有元素均为该结点的祖先。
void printFore(TreeNode* root, ElemType x){
Stack s[MaxSize];
int top = 0;
while (root || top != 0){
while (root&&root->val != x){
s[++top].t = root;
s[top].tag = 0;
root = root->left;
}
if (root&&root->val == x){
for (int i = 1; i <= top; i++){
cout << s[top].t->val << " ";
}
cout << endl;
return;
}
while (top != 0 && s[top].tag == 1)
top--;
if (top != 0){
s[top].tag = 1;
root = s[top].t->right;
}
}
}
原文:http://blog.csdn.net/kaitankedemao/article/details/44707279