二叉树相关笔试题(一)

来源:互联网 发布:裸钻哪里买 知乎 编辑:程序博客网 时间:2024/05/11 08:27

1.根据二叉树的前序遍历和中序遍历的结果重建二叉树

分析:二叉树的前序遍历顺序是根->左->右,中序遍历顺序是左->根->右,由此可以看出在前序遍历中的第一个数字为二叉树的根节点,接着扫描中序遍历的结果就可以得到根结点的位置,在根节点左边的数为左子树结点的值,位于根节点右边的为右子树结点的值,接下来可以用递归的方法分别构建左右子树。

实现代码:

TreeNode* reConstructBinaryTree(vector<int> pre, int start_pre, int end_pre,                           vector<int> in ,int start_in, int end_in) {        if(start_pre > end_pre || start_in > end_in){            return NULL;        }        TreeNode* root = new TreeNode(pre[start_pre]);        for(int i = start_in; i < in.size(); i++){            if(in[i] == pre[start_pre]){                root->left =  reConstructBinaryTree(pre, start_pre+1, start_pre+i-start_in,                                            in, start_in,i-1);                root->right = reConstructBinaryTree(pre, i-start_in+start_pre+1, end_pre,                                                   in, i+1,end_in);            }        }        return root;    }TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {    if(pre.empty() || in.empty()){        return NULL;        }    return reConstructBinaryTree(pre, 0 ,pre.size() - 1, in, 0, in.size() - 1);}

2.树的子结构

题目:输入两棵二叉树A和B,判断B是不是A的子结构。

分析:要查找树A中是否存在和树B一样的子结构,可以先在树A中找到和B根节点一样的结点R,然后再判断树A中R的子树是不是包含和树B一样的结构,同样可以用递归的方法来实现。

实现代码:

    bool IsSubTree(TreeNode* pRoot1, TreeNode* pRoot2)    {        if(pRoot2 == NULL){            return true;        }        if(pRoot1 == NULL){            return false;        }        if(pRoot1->val != pRoot2->val){            return false;        }        return IsSubTree(pRoot1->left, pRoot2->left) && IsSubTree(pRoot1->right, pRoot2->right);    }         bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)    {        bool flag = false;        if(pRoot1 != NULL && pRoot2 != NULL){            if(pRoot1->val == pRoot2->val){                flag = IsSubTree(pRoot1,pRoot2);            }            if(!flag){                flag = HasSubtree(pRoot1->right, pRoot2);            }            if(!flag){                flag = HasSubtree(pRoot1->left, pRoot2);            }        }                 return flag;    }


3.二叉树的镜像

分析:先序遍历二叉树,如果遍历到的结点有子节点,那么就交换它的子节点,直到交换完所有的非叶子节点。

实现代码:

    void Mirror(TreeNode *pRoot) {        if(pRoot == NULL){            return;        }        if(pRoot->left || pRoot->right){            swap(pRoot->left, pRoot->right);        }        Mirror(pRoot->left);        Mirror(pRoot->right);    }


4.从上往下打印二叉树

分析:即二叉树的层序遍历

实现代码:

    vector<int> PrintFromTopToBottom(TreeNode *root) {        vector<int> list;        if(root == NULL){            return list;        }        queue<TreeNode*> q;        q.push(root);        while(!q.empty()){            TreeNode* cur = q.front();            q.pop();            if(cur->left != NULL){                q.push(cur->left);            }            if(cur->right != NULL){                q.push(cur->right);            }            list.push_back(cur->val);        }        return list;    }

5.二叉搜索树的后序遍历序列

题目:输入一个整数数组,判断该数组是不是二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false。假设输入的数组的任意两个数字互不相同。

分析:二叉树后序遍历的顺序为左->右->根,因此最后一个数字为二叉搜索树的根节点的值,又因为二叉搜索树的左子树的值都比根结点的值小,右子树的值都比跟结点的值大,因此数组中最后一个数前面的数字可分为两部分,一部分是根节点左子树的值,另一部分是根节点右子树的值,接下来可以用相同的方法判断数组每一部分对应子树的结构,也就是一个递归的过程。

实现代码:

    bool Judge(vector<int> sequence, int begin, int end) {        if(begin == end){            return true;        }        int root = sequence[end];        int i = begin;        while(i < end){            if(sequence[i] > root){                break;            }            ++i;        }        int j = i;        while(j < end){            if(sequence[j] < root){                return false;            }            ++j;        }        int left  =true;        if(i > 0){            left = Judge(sequence, 0, i-1);        }        int right = true;        if(i < end){            right = Judge(sequence, i, end-1);        }        return (left&&right);    }         bool VerifySquenceOfBST(vector<int> sequence) {        if(sequence.empty()){            return false;        }        return Judge(sequence, 0, sequence.size()-1);    }




1 0