• 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。


    // test20.cpp : 定义控制台应用程序的入口点。
    //

    #include "stdafx.h"
    #include<iostream>
    #include<vector>
    #include<string>
    #include<queue>
    #include<stack>
    #include<cstring>
    #include<string.h>
    #include<deque>
    #include <forward_list>
    
    using namespace std;
    
    
    
    struct TreeLinkNode {
    int val;
    struct TreeLinkNode *left;
    struct TreeLinkNode *right;
    struct TreeLinkNode *next;
    TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
    
    }
    };
    
    class Solution {
    public:
    	TreeLinkNode* GetNext(TreeLinkNode* pNode)
    	{
    		//判断该节点是叶子节点还是跟节点
    		// 如果该节点是叶子节点,则
    		   //如果改节点是左孩子,则其下一个节点是父节点
    		   //如果该节点是右孩子,则其下一个节点是父节点的父节点
    		//注意:最右的右孩子怎么判断
    		//如果该节点不是叶子节点
    		   //如果该节点有无右孩子,则其下一个节点是父节点
    		   //如果该节点有右孩子,则其下一个节点是右孩子的最左节点
    
    		if (pNode == NULL) return NULL;
    	//	if (pNode->left == NULL && pNode->right == NULL)//该节点是叶子节点;或者说该节点没有右孩子
       if (pNode->right == NULL)//该节点是叶子节点;或者说该节点没有右孩子
    		{
    			if (pNode->next == NULL)//没有双亲
    				return NULL; //就这一个节点,没有双亲
    			else if (pNode->next->left == pNode) //是节点的左孩子
    				return pNode->next;  //如果是左孩子,则返回双亲节点
    			else if (pNode->next->right == pNode) //是节点的右孩子
    			{
    				//判断该节点是否是节点的最右孩子,如果是最右孩子,返回NULL
    				TreeLinkNode* parent = pNode->next;
    				while (parent->next!=NULL)
    				{
    					parent = parent->next; //找到根节点
    				}
    				while (parent->right!=NULL)//找到最右节点
    				{
    					parent = parent->right;
    				}
    				if (parent == pNode) return NULL;
    				return pNode->next->next;
    			}
    		}
    
    	   //如果该节点有右孩子,则返回右孩子的最左节点
    	   pNode = pNode->right;
    	   while (pNode->left!=NULL)
    	   {
    		   pNode = pNode->left;
    	   }
    	   return pNode;
    		
    	}
    };
    int main()
    {
    
    //	//vector<int> vec = { 49,38,65,97,76,13,27};
    	//vector<int> vec1 = { 49,38};
    	//vector<int> vec = { 1,2,3,4,5,6,7,0};
    	TreeLinkNode* t1 = new TreeLinkNode(8);
    	TreeLinkNode* t2 = new TreeLinkNode(6);
    	TreeLinkNode* t3 = new TreeLinkNode(10);
    	TreeLinkNode* t4 = new TreeLinkNode(5);
    	TreeLinkNode* t5 = new TreeLinkNode(7);
    	TreeLinkNode* t6 = new TreeLinkNode(9);
    	TreeLinkNode* t7 = new TreeLinkNode(11);
    	t1->left = t2;
    	t1->right = t3;
    	t2->left = t4;
    	t2->right = t5;
    	t3->left = t6;
    	t3->right = t7;
    	t2->next = t1;
    	t3->next = t1;
    	t4->next = t2;
    	t5->next = t2;
    	t6->next = t3;
    	t7->next = t3;
    	Solution so;
    	if (so.GetNext(t1) == NULL)
    	{
    		cout << "没有下一个节点" << endl;
    	}
    	else {
    		cout << "so.GetNext(t1):" << so.GetNext(t1)->val << endl;
    	}
    
    	return 0;
    }
  • 相关阅读:
    css div position to parent
    linux 解压缩/压缩命令大全
    button with backgroundimage programmaticaly
    使用数组初始化vector 对象
    AudioServicesPlaySystemSound
    objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
    指针和多维数组(例子需要好好消化理解)
    很经典的赋值算法之一:动态为数组有序赋值
    string 类的c_str 的成员函数
    自由存储区的空间 C++和C
  • 原文地址:https://www.cnblogs.com/wdan2016/p/6068379.html
Copyright © 2020-2023  润新知