【剑指】8.二叉树的下一个结点

题目描述

  • 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。

算法分析

  1. 当前节点无父节点pNode->next==nullptr,则返回nullptr;
  2. 当前节点有右子树pNode->right != nullptr:当前节点为其父节点的左节点pNode->next->left == pNode,则返回其父节点pNode->next;当前节点为其父子树的右节点pNode->next->right == pNode,则向上寻找其父节点pNode = pNode->next,直到当前节点为其左节点pNode->next->left == pNode,返回其父节点pNode->next。
  3. 当前节点无右子树pNode->right == nullptr,以该节点开始中序遍历该节点。

提交代码:

class Solution {
public:
	TreeLinkNode* GetNext(TreeLinkNode* pNode)
	{
		if (!pNode)
			return pNode;

		if (!pNode->right)
		{
			while (pNode->next && pNode->next->left != pNode)
				pNode = pNode->next;
			if (pNode->next)
				return pNode->next;
			else
				return nullptr;
		}
		else
		{
			pNode = pNode->right;
			while (pNode->left)
			{
				pNode = pNode->left;
			}
			return pNode;
		}
	}
};

测试代码:

#include<iostream>

using namespace std;
/*
// 面试题8:二叉树的下一个结点
// 题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?
// 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针。
*/
struct TreeLinkNode {
	int val;
	struct TreeLinkNode *left;
	struct TreeLinkNode *right;
	struct TreeLinkNode *next;
	TreeLinkNode(int x) :
		val(x), left(nullptr), right(nullptr), next(nullptr) {

	}
};
// ==================== 辅助代码用来构建二叉树 ====================
TreeLinkNode* CreateTreeLinkNode(int value)
{
	TreeLinkNode* pNode = new TreeLinkNode(value);
	return pNode;
}

void ConnectTreeNodes(TreeLinkNode* pParent, TreeLinkNode* pLeft, TreeLinkNode* pRight)
{
	if (pParent != nullptr)
	{
		pParent->left = pLeft;
		pParent->right = pRight;

		if (pLeft != nullptr)
			pLeft->next = pParent;
		if (pRight != nullptr)
			pRight->next = pParent;
	}
}

void PrintTreeNode(TreeLinkNode* pNode)
{
	if (pNode != nullptr)
	{
		printf("value of this node is: %d\n", pNode->val);

		if (pNode->left != nullptr)
			printf("value of its left child is: %d.\n", pNode->left->val);
		else
			printf("left child is null.\n");

		if (pNode->right != nullptr)
			printf("value of its right child is: %d.\n", pNode->right->val);
		else
			printf("right child is null.\n");
	}
	else
	{
		printf("this node is null.\n");
	}

	printf("\n");
}

void PrintTree(TreeLinkNode* pRoot)
{
	PrintTreeNode(pRoot);

	if (pRoot != nullptr)
	{
		if (pRoot->left != nullptr)
			PrintTree(pRoot->left);

		if (pRoot->right != nullptr)
			PrintTree(pRoot->right);
	}
}

void DestroyTree(TreeLinkNode* pRoot)
{
	if (pRoot != nullptr)
	{
		TreeLinkNode* pLeft = pRoot->left;
		TreeLinkNode* pRight = pRoot->right;

		delete pRoot;
		pRoot = nullptr;

		DestroyTree(pLeft);
		DestroyTree(pRight);
	}
}

// ====================测试代码====================
void Test(char* testName, TreeLinkNode* pNode, TreeLinkNode* expected)
{
	if (testName != nullptr)
		printf("%s begins: ", testName);

	Solution s;
	TreeLinkNode* pNext = s.GetNext(pNode);
	if (pNext == expected)
		printf("Passed.\n");
	else
		printf("FAILED.\n");
}

//            8
//        6      10
//       5 7    9  11
void Test1_7()
{
	TreeLinkNode* pNode8 = CreateTreeLinkNode(8);
	TreeLinkNode* pNode6 = CreateTreeLinkNode(6);
	TreeLinkNode* pNode10 = CreateTreeLinkNode(10);
	TreeLinkNode* pNode5 = CreateTreeLinkNode(5);
	TreeLinkNode* pNode7 = CreateTreeLinkNode(7);
	TreeLinkNode* pNode9 = CreateTreeLinkNode(9);
	TreeLinkNode* pNode11 = CreateTreeLinkNode(11);

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

	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, nullptr);

	DestroyTree(pNode8);
}

//            5
//          4
//        3
//      2
void Test8_11()
{
	TreeLinkNode* pNode5 = CreateTreeLinkNode(5);
	TreeLinkNode* pNode4 = CreateTreeLinkNode(4);
	TreeLinkNode* pNode3 = CreateTreeLinkNode(3);
	TreeLinkNode* pNode2 = CreateTreeLinkNode(2);

	ConnectTreeNodes(pNode5, pNode4, nullptr);
	ConnectTreeNodes(pNode4, pNode3, nullptr);
	ConnectTreeNodes(pNode3, pNode2, nullptr);

	Test("Test8", pNode5, nullptr);
	Test("Test9", pNode4, pNode5);
	Test("Test10", pNode3, pNode4);
	Test("Test11", pNode2, pNode3);

	DestroyTree(pNode5);
}

//        2
//         3
//          4
//           5
void Test12_15()
{
	TreeLinkNode* pNode2 = CreateTreeLinkNode(2);
	TreeLinkNode* pNode3 = CreateTreeLinkNode(3);
	TreeLinkNode* pNode4 = CreateTreeLinkNode(4);
	TreeLinkNode* pNode5 = CreateTreeLinkNode(5);

	ConnectTreeNodes(pNode2, nullptr, pNode3);
	ConnectTreeNodes(pNode3, nullptr, pNode4);
	ConnectTreeNodes(pNode4, nullptr, pNode5);

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

	DestroyTree(pNode2);
}

void Test16()
{
	TreeLinkNode* pNode5 = CreateTreeLinkNode(5);

	Test("Test16", pNode5, nullptr);

	DestroyTree(pNode5);
}

int main(int argc, char* argv[])
{
	Test1_7();
	Test8_11();
	Test12_15();
	Test16();
}

猜你喜欢

转载自blog.csdn.net/ansizhong9191/article/details/80384653