首页 > 其他 > 详细

有关二叉树的部分操作

时间:2015-03-28 23:17:38      阅读:510      评论:0      收藏:0      [点我收藏+]
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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!