有关二叉树的部分操作

来源:互联网 发布:找淘宝达人推广的技巧 编辑:程序博客网 时间:2024/05/17 06:37
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;            }        }    }
0 0
原创粉丝点击