摘要:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。把一个有序整数数组放到一棵二叉树中,要求树的高度最小。1、思路: 前序遍历的第一个是根结点,在中序遍历中找到该结点,则该结点左侧是左子树的范围,右侧是右子树的范围。由该范围再去前序遍历数组中圈定同样个数的左右子树。同理递归处理左右子树。Construct 1 BinaryTreeNode* Construct(int* preorder, int* inorder, int length) 2 { 3 if(preorder == NULL || inorder ... 阅读全文
摘要:
输入一棵二叉树的根节点,求该树的深度即最长路径。输入一颗二叉树的根节点,判断是否是平衡二叉树。求二叉树中节点的最大距离。1、思路: 根结点的高度等于左右子树中大者+1,也就是说先算完左右子树的高度之后再算根节点的高度,即后序遍历。TreeDepth 1 int TreeDepth(BinaryTreeNode* pRoot) 2 { 3 if(pRoot == NULL) 4 return 0; 5 6 int nLeft = TreeDepth(pRoot->m_pLeft); 7 int nRight = TreeDepth(pRoot->m_p... 阅读全文
摘要:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。1、思路: 二叉搜索树的一大特点就是中序遍历可以将二叉搜索树从小到大排列。需要维护一个变量存放前一个访问到的元素,使该元素的右指针指向当前节点,当前节点的左指针指向该元素。终止条件是到达叶子节点。Convert 1 BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree) 2 { 3 BinaryTreeNode *pLastNodeInList = NULL; 4 ConvertNode(pRootOfTree, &pLastNodeInList); 5 6 ... 阅读全文
摘要:
参考:http://zhedahht.blog.163.com/请完成一个函数,输入一个二叉树,输出它的镜像。输入两颗二叉树A和B,判断B是不是A的子结构。输入一棵二叉树和一个整数,打印出二叉树中结点值和为该整数的所有路径。1、思路: 先序遍历。对每个子树的根结点,交换左右子树的指向,终止条件是到达叶子节点,就不需要交换左右子节点了。MirrorRecursively 1 void MirrorRecursively(BinaryTreeNode *pNode) 2 { 3 if((pNode == NULL) || (pNode->m_pLeft == NULL && 阅读全文
摘要:
sibling链表:链表的节点信息,除了next的指向以外,还有sibling的指向。请复制该链表。带环链表:一个单链表(带环),如何找到环的入口点。环形链表:0、1...n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第n个数字。求这个圆圈里剩下的最后一个数字。双向链表:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。1、思路: 参见剑指offer的26题CloneNodes 1 ComplexListNode* Clone(ComplexListNode* pHead) 2 { 3 CloneNodes(pHead); 4 ConnectSibl... 阅读全文
摘要:
list题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第n个数字。求出这个圆圈里剩下的最后一个数字。思路:可以用list来模拟环形链表,当迭代器达到end时(end是超出末尾的哨兵),迭代器重新赋值为begin。list内部erase效率非常高,注意erase的迭代器的后一位是作为下一次迭代的开始位,也要满足环形特点。时间复杂度为O(mn),空间复杂度为O(n)。LastRemaining 1 int LastRemaining(unsigned int n, unsigned int m) 2 { 3 if(n < 1 || m < 1) 4 阅读全文
摘要:
参考:http://zhedahht.blog.163.com输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照增序排列的。输入两个单链表(无环),找出他们的第一个公共节点。判断两个单链表(可能有环)是否相交。1、思路: 类似与归并排序,但是这里只需要修改指针指向,不需要另辟空间,通过递归的方式,从后往前拼接链表。MergeList 1 ListNode* Merge(ListNode* pHead1, ListNode* pHead2) 2 { 3 if(pHead1 == NULL) 4 return pHead2; 5 else if(... 阅读全文
摘要:
参考:http://zhedahht.blog.163.com/输入一个链表的头结点,从尾到头反过来打印出每个节点的值。给定单向链表的头结点和一个结点指针,定义一个函数在O(1)时间删除该结点。输入一个单链表的,输出该链表中倒数第k个结点。定义一个函数,输入一个链表的头结点,反转该链表并输出反转链表的头结点。1、思路: 递归方式:利用栈的“先入后出”的特性,轻松解决。这里提供一个递归方法来模拟栈。PrintListReverse1 void PrintListReverse(ListNode* head)2 {3 if (head != NULL)4 {5 P... 阅读全文
摘要:
输入两个整数序列,第一个表示压入顺序,判断第二个是否是该栈的弹出顺序。选择题1、思路: 对弹出序列的元素依次分析,如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。IsOrder 1 #include <iostream> 2 #include <assert.h> 3 #include <stack> 4 5 using namespace std; 6 7 阅读全文
摘要:
转:http://zhedahht.blog.163.com用两个栈实现队列。定义栈的数据结构,请在该类型中实现一个能够得到栈的最小min函数。在该栈中,调用min和push及pop的时间复杂度都是O(1)。1、思路: 一个栈是先入后出,两个配合就是先入先出。一个栈负责push,一个负责pop,当pop栈没有数据了需要去push栈中去拿。Queue 1 #include <iostream> 2 #include <stack> 3 #include <exception> 4 5 using namespace std; 6 7 template < 阅读全文