程序员面试金典-4.6寻找下一个节点
2017-03-02 10:31
375 查看
一、题目描述
请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继)。
给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值。保证结点的值大于等于零小于等于100000且没有重复值,若不存在后继返回-1。
二、解题思路
1.本题是寻找指定节点的下一个节点(按照中序遍历),首先应该明白什么是中序遍历,后序遍历和前序遍历。
中序遍历是指按照左中右的方式来遍历一棵树;后序遍历是按照左右中的方式来遍历;先序遍历是按照中左右的方式来遍历。遍历的代码参考http://blog.csdn.net/piaoxue820/article/details/39156649
2.如果采用递归的方式来求解,需要用一个变量来记录目标树节点,这样在遍历下一个节点的时候就可以返回目标树节点的后继节点的值。
3.如果不用递归实现,则需要用到栈,当然也需要一个标记量来记录是否找到了目标树节点,从而输出目标树节点的后继节点值。
三、代码
1.先序遍历、中序遍历和后序遍历的代码
请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继)。
给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值。保证结点的值大于等于零小于等于100000且没有重复值,若不存在后继返回-1。
二、解题思路
1.本题是寻找指定节点的下一个节点(按照中序遍历),首先应该明白什么是中序遍历,后序遍历和前序遍历。
中序遍历是指按照左中右的方式来遍历一棵树;后序遍历是按照左右中的方式来遍历;先序遍历是按照中左右的方式来遍历。遍历的代码参考http://blog.csdn.net/piaoxue820/article/details/39156649
2.如果采用递归的方式来求解,需要用一个变量来记录目标树节点,这样在遍历下一个节点的时候就可以返回目标树节点的后继节点的值。
3.如果不用递归实现,则需要用到栈,当然也需要一个标记量来记录是否找到了目标树节点,从而输出目标树节点的后继节点值。
三、代码
1.先序遍历、中序遍历和后序遍历的代码
//前序遍历,中左右 public void preOrder(Node node){ if(node!=null){ System.out.print(node.val+","); preOrder(node.left); preOrder(node.right); } }
//前序遍历,中左右,非递归 public void preOrderN(Node node){ Stack<Node> stack=new Stack<Node>(); Node cur=node; while(cur!=null || !stack.empty()){ if(cur!=null){ System.out.print(cur.val); stack.push(cur); cur=cur.left; }else{ cur=stack.pop(); cur=cur.right; } } }
//中序遍历,左中右,递归public void inOrder(Node node){if(node!=null){inOrder(node.left);System.out.print(node.val+",");inOrder(node.right);}}//中序遍历,非递归 public void inOrderN(Node node){ Stack<Node> stack=new Stack<Node>(); Node cur=node; while(cur!=null || !stack.empty()){ while(cur!=null){ stack.push(cur); cur=cur.left; } if(!stack.empty()){ Node qNode=stack.pop(); System.out.print(qNode.val+","); cur=qNode.right; } } } //后续遍历 ,左右中 public void postOrder(Node node){ if(node!=null){ postOrder(node.left); postOrder(node.right); System.out.print(node.val+","); } }//后序遍历,左右中,非递归 public void postOrderN(Node node){ Stack<Node> stack=new Stack<Node>(); Stack<Node> output=new Stack<Node>(); Node cur=node; while(cur!=null || !stack.empty()){ if(cur!=null){ output.push(cur); stack.push(cur); cur=cur.right; }else{ cur=stack.pop(); cur=cur.left; } } while(!output.empty()){ System.out.print(output.pop().val+","); } }
2.本题的代码(注释部分为递归实现,非注释部分为非递归实现)import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } }*/ public class Successor { TreeNode pre=new TreeNode(-1); public int findSucc(TreeNode root, int p) { // write code here boolean isFound=false; Stack<TreeNode> stack=new Stack<TreeNode>(); TreeNode cur=root; while(cur!=null || !stack.empty()){ while(cur!=null){ stack.push(cur); cur=cur.left; } if(!stack.empty()){ TreeNode q=stack.pop(); if(isFound) return q.val; else{ if(q.val==p) isFound=true; } cur=q.right; } } return -1; /* if(root==null) return -1; int left=findSucc(root.left,p); if(left==-1){ if(pre.val==p) return root.val; pre=root; return findSucc(root.right,p); } return left; */ } }
相关文章推荐
- 《程序员面试金典》--寻找二叉树中某个节点中序遍历的下一个节点
- [CareerCup] 4.6 Find Next Node in a BST 寻找二叉搜索树中下一个节点
- 4.6 找出二叉树中指定节点的下一个节点(中序后继),假定每个节点有父指针。
- 程序员面试金典: 9.4树与图 4.6找出二叉查找树指定结点的下一个结点
- 二叉查找树中寻找下一个节点
- 程序员面试金典--面试22之寻找二叉树中指定结点的下一个结点
- 《程序员面试金典》--寻找二叉树中两个节点的第一个公共祖先(三种情况)
- 程序员面试金典——寻找下一个结点
- 寻找下一个节点
- 寻找中序遍历下一个节点
- 寻找下一个同级元素节点
- 程序员面试金典: 检查是否为BST、 寻找下一个结点
- 剑指offer(60):二叉树的下一个节点
- 58 - 二叉树的中序遍历的下一个节点
- 【二叉树6】寻找二叉树中任意节点最远的距离
- 程序员面试金典2.1:编写代码,移除未排序的链表中的重复节点
- 浪潮之巅 第二十三章 寻找下一个 Google
- 2704:寻找平面上的极大点(4.6算法之贪心)
- 《剑指Offer》面试题:寻找两个链表的第一个公共节点
- 寻找二叉树两个节点的最低公共祖先