二叉树面试题

1、>> 二叉树的后续遍历非递归
void PostOrder_Nor()//后序遍历 非递归
	{
		if(_pRoot == NULL)
			return;

		stack<Node*> s;
		Node* pCur = _pRoot;
		Node* prev = NULL;//临时变量 保存刚刚访问过的节点

		while(pCur || !s.empty())
		{
			
			while(pCur)//保存左边路径上的节点
			{
				s.push(pCur);
				
				pCur = pCur->_pLeft;			
			}
			if(!s.empty())//???
			{
			pCur = s.top();
			if(pCur->_pRight == NULL || pCur->_pRight == prev)
			{
				cout<<pCur->_value<<" ";
				prev = pCur;
				s.pop();
				pCur = NULL;//
			}
			else
				pCur = pCur->_pRight;
			}	
		}
	}
2、>> 判断一棵树是否为完全二叉树
	bool IsCompleteBinaryTree()
	{
		if(_pRoot == NULL)
		return true;

		queue<Node*> q;
        Node* pCur = _pRoot;
		q.push(pCur);

		bool flag = false;
		while(!q.empty())
		{
			pCur = q.front();
			if(flag)
			{
				if(pCur->_pLeft || pCur->_pRight)
					return false;
			}
			else
			{
				if(pCur->_pLeft && pCur->_pRight)
				{
					q.push(pCur->_pLeft);
					q.push(pCur->_pRight);
				}
				else if(pCur->_pLeft)
				{
					q.push(pCur->_pLeft);
					flag = true;
				}
				else if(pCur->_pRight)
					return false;
				else
					flag = true;
			}
			q.pop();
			
		}return true;
		
	}
3、>> 根据前序和中序遍历结果重建二叉树
4、>> 寻找二叉树中两个结点的公共祖先结点
#include<iostream>
using namespace std;
#include<stack>
#include<vector>
typedef struct Node
{
	char _data;
	Node* _pLeft;
	Node* _pRight;

	Node(char data)
		:_data(data)
		,_pLeft(NULL)
		,_pRight(NULL)
	{}
	~Node()
	{
		delete _pLeft;
		delete _pRight;
	}
};

Node* RebuildBinaryTree(char* PreOrder,char* InOrder,int n)
{
	if(n == 0)
		return NULL;

	char data = PreOrder[0];//根据前序创建根
	Node* node = new Node(data);

	int i = 0;
	for(i = 0; i<n && InOrder[i]!=data; i++)
		;
	int Leftlen = i;//左子树长度
	int Rightlen = n-i-1;//不算中间的根节点 右子树长度

	if(Leftlen)//递归左子树
		node->_pLeft = RebuildBinaryTree(&PreOrder[1],&InOrder[0],Leftlen);
	if(Rightlen)//递归右子树
		node->_pRight = RebuildBinaryTree(&PreOrder[Leftlen+1],&InOrder[Leftlen+1],Rightlen);
	return node;
}



bool FindPath(Node* pRoot, vector<char> &path, char key)//找路径
{
	if(pRoot == NULL)
		return false;

	path.push_back(pRoot->_data);
	if(pRoot->_data == key)
		return true;

	if(FindPath(pRoot->_pLeft,path,key)||FindPath(pRoot->_pRight,path,key))//在左右子树中找路径
		return true;

	path.pop_back();
	return false;
}

char FindLCA(Node* pRoot,char key1, char key2)//找最近公共祖先节点
{
	vector<char> path1;
    vector<char> path2;

	bool find1 = FindPath(pRoot, path1, key1);
	bool find2 = FindPath(pRoot, path2, key2);

	if(find1&&find2)
	{
		char ans;
		int i;
		for(i = 0; i<path1.size(); i++)
		{
			if(path1[i]!=path2[i])
			  break;
		
	        else
		      ans = path1[i];
		}
	    return ans;
	}
	return -1;
}


int main()
{
	char s1[6] = {'a','b','d','c','e','f'};
	char s2[6] = {'d','b','a','e','c','f'};
	Node* node = RebuildBinaryTree(s1,s2,6);
    cout<<FindLCA(node,'e','d')<<endl;
	system("pause");
	return 0;
}

Python二叉树面试题有很多种,以下是其中几个常见的面试题: 1. 二叉树的最大深度:这个问题要求计算给定二叉树的最大深度。可以使用递归的方法来解决,递归函数的定义是返回当前节点的深度,递归终止条件是节点为空时返回0,递归过程中比较左右子树的深度并返回较大值加1。时间复杂度为O(n),空间复杂度为O(n)。 2. 二叉树的前序遍历:这个问题要求按照前序遍历的顺序输出二叉树节点值。可以使用递归或迭代的方法来解决。递归方法的思路是先输出当前节点的值,然后递归遍历左子树,最后递归遍历右子树。迭代方法可以使用栈来辅助实现,把根节点压入栈中,然后循环弹出栈顶节点,输出其值,并将其右子节点和左子节点依次压入栈中。时间复杂度为O(n),空间复杂度为O(n)。 3. 二叉树的层序遍历:这个问题要求按照层序遍历的顺序输出二叉树节点值。可以使用队列来辅助实现。首先将根节点入队,然后循环直到队列为空,每次从队列中取出一个节点,输出其值,并将其左右子节点依次入队。时间复杂度为O(n),空间复杂度为O(n)。 以上是几个常见的Python二叉树面试题的解法,根据具体的问题要求和输入条件选择合适的解法即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【编程之路】面试必刷TOP101:二叉树系列(23-30,Python实现)](https://blog.csdn.net/be_racle/article/details/125531755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【面试题8】二叉树的下一个节点](https://download.csdn.net/download/weixin_38589168/14035034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值