剑指offer+面试题8-二叉树-二叉树的下一个节点(java解答)

题目描述

给定一棵二叉树和其中一个节点,如何找出中序遍历序列的下一个节点?树中的结点有三个指针:左子节点,右子节点,父节点

思路

  • 若一个节点有右子树,则其下一个节点是它的右子树中的最左子节点,即从右子节点出发一直沿着指向左子节点的指针
  • 一个节点没有右子树,若该节点是其父节点的左子节点,则其下一个节点是它的父节点
  • 一个节点没有右子树,且是其父节点的右子节点,则沿父节点一直向上遍历,直到找到一个是它父节点的左子节点的节点
  • 否则返回空

时间复杂度:O(logN)
空间复杂度:O(1)

二叉树的定义,构建及打印

中序遍历序列二叉树的下一个节点代码实现

	public static BinaryTreeNode GetNext(BinaryTreeNode pNode) 
	{
		if(pNode==null)
			return null;
		
		BinaryTreeNode pNext=null;
		
		if(pNode.m_pRight!=null)
		{
			BinaryTreeNode pRight=pNode.m_pRight;
			while(pRight.m_pLeft!=null)
				pRight=pRight.m_pLeft;
			pNext=pRight;
		}
		else if(pNode.m_pParent!=null)
		{
			BinaryTreeNode pCurrent=pNode;
			BinaryTreeNode pParent=pNode.m_pParent;
			while(pParent!=null && pParent.m_pRight==pCurrent)
			{
				pCurrent=pParent;
				pParent=pCurrent.m_pParent;				
			}
			pNext=pParent;
		}
		return pNext;
	}

测试

  • 普通二叉树
  • 特殊二叉树(左斜树;右斜树;仅一个根结点的二叉树;二叉树根结点为null)
  • 不同位置节点的下一个节点(思路中提到的三种情况)
	// ======== 测试代码 ========
	public static void Test(String testName,BinaryTreeNode pNode,BinaryTreeNode expected)
	{
		if(testName!=null)
			System.out.print(testName);
		if(pNode!=null)
			System.out.print(" begins: node "+pNode.m_nValue+" -> ");
		else
			System.out.print(" begins: node "+pNode+" -> ");
			
		//T08_BinaryTree result=new T08_BinaryTree();
		BinaryTreeNode pNext=GetNext(pNode);
		if(pNext==expected)
			System.out.println("Passed.");
		else
			System.out.println("FAILED.");
	}
	
	// 普通二叉树
	//  	8
	//  6      10
	// 5 7    9  11	
	public static void Test1_7()
	{
		T08_BinaryTree main=new T08_BinaryTree();
		
		BinaryTreeNode pNode8=main.CreateBinaryTreeNode(8);
		BinaryTreeNode pNode6=main.CreateBinaryTreeNode(6);
		BinaryTreeNode pNode10=main.CreateBinaryTreeNode(10);
		BinaryTreeNode pNode5=main.CreateBinaryTreeNode(5);
		BinaryTreeNode pNode7=main.CreateBinaryTreeNode(7);
		BinaryTreeNode pNode9=main.CreateBinaryTreeNode(9);
		BinaryTreeNode pNode11=main.CreateBinaryTreeNode(11);

		main.ConnectTreeNodes(pNode8,pNode6,pNode10);
		main.ConnectTreeNodes(pNode6,pNode5,pNode7);
		main.ConnectTreeNodes(pNode10,pNode9,pNode11);
		
		main.printTree(pNode8);

		Test("Test1",pNode8,pNode9);
		Test("Test2",pNode6,pNode7);
		Test("Test3",pNode10,pNode11);
		Test("Test4",pNode5,pNode6);
		Test("Test5",pNode7,pNode8);
		Test("Test6",pNode9,pNode10);
		Test("Test7",pNode11,null);
	}
	
	// 特殊二叉树: 所有节点都没有右子节点的二叉树
	//  	 5
	//	   4
	//	 3
	// 2
	public static void Test8_11()
	{
		T08_BinaryTree main=new T08_BinaryTree();
		
		BinaryTreeNode pNode5=main.CreateBinaryTreeNode(5);
		BinaryTreeNode pNode4=main.CreateBinaryTreeNode(4);
		BinaryTreeNode pNode3=main.CreateBinaryTreeNode(3);
		BinaryTreeNode pNode2=main.CreateBinaryTreeNode(2);

		main.ConnectTreeNodes(pNode5,pNode4,null);
		main.ConnectTreeNodes(pNode4,pNode3,null);
		main.ConnectTreeNodes(pNode3,pNode2,null);
		
		main.printTree(pNode5);

		Test("Test8",pNode5,null);
		Test("Test9",pNode4,pNode5);
		Test("Test10",pNode3,pNode4);
		Test("Test11",pNode2,pNode3);
	}
	
	// 特殊二叉树: 所有节点都没有左子节点的二叉树
	//  2
	//   3
	//    4
	//     5
	public static void Test12_15()
	{
		T08_BinaryTree main=new T08_BinaryTree();
		
		BinaryTreeNode pNode2=main.CreateBinaryTreeNode(2);
		BinaryTreeNode pNode3=main.CreateBinaryTreeNode(3);
		BinaryTreeNode pNode4=main.CreateBinaryTreeNode(4);
		BinaryTreeNode pNode5=main.CreateBinaryTreeNode(5);

		main.ConnectTreeNodes(pNode2,null,pNode3);
		main.ConnectTreeNodes(pNode3,null,pNode4);
		main.ConnectTreeNodes(pNode4,null,pNode5);
		
		main.printTree(pNode2);

		Test("Test12",pNode5,null);
		Test("Test13",pNode4,pNode5);
		Test("Test14",pNode3,pNode4);
		Test("Test15",pNode2,pNode3);
	}	

	// 特殊二叉树: 只有一个根结点
	public static void Test16()
	{
		T08_BinaryTree main=new T08_BinaryTree();
		BinaryTreeNode pNode5=main.CreateBinaryTreeNode(5);
		main.printTree(pNode5);
		Test("Test16",pNode5,null);
	}
	
	// 特殊二叉树: 根结点为空
	public static void Test17()
	{
		T08_BinaryTree main=new T08_BinaryTree();
		main.printTree(null);
		Test("Test17",null,null);
	}
	

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于协同过滤、矩阵分解、gvdt+lr、wide&deep等算法的推荐模型python实现源码含项目说明+数据集.zip 推荐算法的实现,python、jupyter双版本,详尽注释。 正在努力更新中... #### 对MovieLens电影评分小型数据集做Top N推荐: 0. baseline--推荐最热门的N=20部电影,precision=11%, recall=4%, coverage=0.2%, popularity=169。这部分内容包含在UserCF.py 1. UserCF,precision=25%, recall=10%, coverage=10%, popularity=4.4 2. ItemCF,precision=26%, recall=10%, coverage=15%, popularity=4.3 #### 对MovieLens电影评分小型数据集做评分预测: 0. baseline--使用所有评分的均值做预测,MAE:0.83。这部分内容包含在LinearRegression_Rating.ipynb 1. BiasSVD,MAE:0.68 2. LinearRegression,MAE:0.61 #### 对criteo广告展示小型数据集做点击率预测 1. gbdt+lr,binary_logloss:0.4783 #### 对Census数据中的收入做二分类 0. Google TensorFlow Guide上的Wide&Deep基准模型准确率: 0.83。(从有的知乎博主分享的链接来看,已经打不开了) 1. Wide&Deep, accuracy: 0.8587

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值