二叉树相关笔试题(一)
来源:互联网 发布:裸钻哪里买 知乎 编辑:程序博客网 时间: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
- 二叉树相关笔试题(一)
- 二叉树相关笔试题(二)
- 二叉树相关笔试题(三)
- 二叉树相关笔试面试问题集锦
- 【面试笔试】二叉树相关操作
- 二叉树笔试题
- 二叉树笔试题
- 二叉树笔试题
- 链表相关笔试题(一)
- C++二叉树笔试题
- 刷刷笔试题~!![二叉树]
- 网易笔试题:二叉树
- 二叉树相关题
- 二叉树的相关操作(一)
- 二叉树相关的面试题<一>
- 网易实习生笔试题:二叉树
- 网易实习生笔试编程题 二叉树
- 刷刷笔试题~~[二叉树编程]
- git之撤销更改
- java Arrays工具类
- 动画的设置 pop
- HTTPS的误解(一)
- IGMP补充
- 二叉树相关笔试题(一)
- 隐马尔可夫模型
- log4j 打印sql,按日期生成文件,生成文件位置
- Android内存优化之OOM
- MySQL的varchar定义长度到底是字节还是字符
- CTSVerifier test 教程
- ios开发中类方法与self的注意点 与实例方法区别
- wordpress使用记录
- linux ps命令学习