2013年4月14日

摘要: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。把一个有序整数数组放到一棵二叉树中,要求树的高度最小。1、思路: 前序遍历的第一个是根结点,在中序遍历中找到该结点,则该结点左侧是左子树的范围,右侧是右子树的范围。由该范围再去前序遍历数组中圈定同样个数的左右子树。同理递归处理左右子树。Construct 1 BinaryTreeNode* Construct(int* preorder, int* inorder, int length) 2 { 3 if(preorder == NULL || inorder ... 阅读全文
posted @ 2013-04-14 21:59 月moon鸟 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 输入一棵二叉树的根节点,求该树的深度即最长路径。输入一颗二叉树的根节点,判断是否是平衡二叉树。求二叉树中节点的最大距离。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... 阅读全文
posted @ 2013-04-14 21:30 月moon鸟 阅读(349) 评论(0) 推荐(0) 编辑
摘要: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。1、思路: 二叉搜索树的一大特点就是中序遍历可以将二叉搜索树从小到大排列。需要维护一个变量存放前一个访问到的元素,使该元素的右指针指向当前节点,当前节点的左指针指向该元素。终止条件是到达叶子节点。Convert 1 BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree) 2 { 3 BinaryTreeNode *pLastNodeInList = NULL; 4 ConvertNode(pRootOfTree, &pLastNodeInList); 5 6 ... 阅读全文
posted @ 2013-04-14 21:00 月moon鸟 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 参考: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 && 阅读全文
posted @ 2013-04-14 20:50 月moon鸟 阅读(472) 评论(0) 推荐(0) 编辑
摘要: 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... 阅读全文
posted @ 2013-04-14 16:39 月moon鸟 阅读(188) 评论(0) 推荐(0) 编辑

导航