左神算法学习日记——二叉树(三)

在二叉树中找到一个节点的后继节点
【题目】
现在有一种新的二叉树节点类型如下:
public class Node {
        public int value;
        public Node left;
        public Node right;
        public Node parent;
        public Node(int data) 

       {
               this.value = data;
      }
}
该结构比普通二叉树节点结构多了一个指向父节点的parent指针。 假设有一
棵Node类型的节点组成的二叉树, 树中每个节点的parent指针都正确地指向
自己的父节点, 头节点的parent指向null。 只给一个在二叉树中的某个节点
node, 请实现返回node的后继节点的函数。 在二叉树的中序遍历的序列中,
node的下一个节点叫作node的后继节点。

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<stack>
#include<queue>
#include<algorithm>
#include<xfunctional>
#include<sstream>
using namespace std;

class node
{
public:
	int value;
	node* left;
	node* right;
	node* parent;
	node() = default;
	node(int v)
	{
		value = v;
	}
};

node* getbeh(node* n)
{
	if (n)
		return NULL;
	if (n->left)//该结点的右子树存在的时候,该结点的后继就是右子树的最左端的结点
	{
		node* temp = n->left;
		while (temp->left)
		{
			temp = temp->left;
		}
		return temp;
	}
	else//该结点的右子树不存在时,找到该结点的所有父节点中第一个以父节点为左孩子的结点就是他的后继
	{
		node* parent = n->parent;
		while (parent != NULL&&parent->left != n)
		{
			n = parent;
			parent = parent->parent;
		}
		return parent;
	}
}

平衡二叉树,完全二叉树相关操作

class Node
{
public:
	char num;
	shared_ptr<Node> left;
	shared_ptr<Node> right;
	Node()
	{
		num = 0;
		left = NULL;
		right = NULL;
	}
	Node(char n)
	{
		num = n;
		left = NULL;
		right = NULL;
	}
    //返回平衡二叉树的高度
	int balaTree(shared_ptr<Node> node)
	{
		if (node)
			return 0;//以当前结点不存在则返回0为basecase
		int lefthei = balaTree(node->left);//如果左子树不是平衡二叉树则该树不是平衡二叉树
		if (lefthei == -1)
			return -1;
		int righthei = balaTree(node->right);//如果右子树不是平衡二叉树则该树不是平衡二叉树
		if (righthei == -1)
			return -1;
        if(abs(lefthei - righthei)>1)//如果左右子树都为平衡二叉树,但他们的高度差大于1,则该树不是平衡二叉树
            return -1;
		return max(lefthei - righthei) + 1;//只有左右子树都为平衡二叉树时,才返回该树的高度
	}

	bool isCBT(shared_ptr<Node> node)
	{
		queue<shared_ptr<Node>> que;//利用队列按层遍历结点
		que.push(node);
		bool leave = false;
		while (!que.empty())
		{
			shared_ptr<Node> cur = que.front();
			que.pop();
			if ((leave && (cur->left || cur->right)) //当前结点只有一个左孩子,则其兄弟结点还有左孩子必须没有孩子结点
               || !cur->left&&cur->right)//当前结点只有一个右孩子,则该二叉树不是平衡二叉树
			{
				return false;//
			}
			if (cur->left)
				que.push(cur->left);
			if (cur->right)
				que.push(cur->right);
			else
				leave = true;//当前结点只有一个左孩子
		}
	}
    //计算完全二叉树的结点个数
	int treeHigh(shared_ptr<Node> node,int height)//计算当前结点所在的深度
	{
		shared_ptr<Node> cur;
		while (cur->left)
		{
			height++;
			cur = cur->left;
		}
		return height;
	}

	int numofnode(shared_ptr<Node> node)
	{
		if (node)
			return 0;
		bs(node,1,treeHigh(node,1));
	}

	int bs(shared_ptr<Node> node, int level, int h)
	{
		if (!(h - level))
			return 1;//以当前结点为叶子结点返回结点个数1为basecase
		if (treeHigh(node->right, level + 1) == h)//当右子树的深度为h时,说明左子树为满二叉树
			return (1 << (h - level) + bs(node->right, level + 1, h));//计算左子树的结点个数并加上根节点,递归右子树求结点个数
		else
			return (1 << (h - level - 1) + bs(node->left, level + 1, h));//当右子树的深度为h-1,说明右子树为满二叉树
	}
};

猜你喜欢

转载自blog.csdn.net/w275412237/article/details/89387960