栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

二叉树的四大遍历方法(前中后、层次遍历)(包括typedef 树节点)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二叉树的四大遍历方法(前中后、层次遍历)(包括typedef 树节点)

目录
  • 转载代码:
  • 前中后递归遍历
  • 前序和中序的迭代写法
    • 前序:
    • 中序
      • 中序题解

说到树就胆颤心惊,发誓这几天一定要把它学好,先上学姐的代码:

转载代码:
typedef struct BiTNode {
	char data;
	struct BiTNode *rchild, *lchild;
	bool isfirst = true;
}BiTNode, *BiTree ;
 
//创建二叉树
void DLR_DG_createTree(BiTree &T) {
	char c;
	cin >> c;
	if (c == '#')T = NULL;
	else {
		T = new BiTNode;
		T->data = c;
		DLR_DG_createTree(T->lchild);
		DLR_DG_createTree(T->rchild);
	}
}
//先序递归
void DLR_DG_printTree(BiTree T) {
	if (T!=NULL)
	{
		cout << T->data << " ";
		DLR_DG_printTree(T->lchild);
		DLR_DG_printTree(T->rchild);
	}
}
//中序递归
void LDR_DG_printTree(BiTree T) {
	if (T != NULL)
	{
		LDR_DG_printTree(T->lchild);
		cout << T->data << " ";		
		LDR_DG_printTree(T->rchild);
	}
}
//后序递归
void LRD_DG_printTree(BiTree T) {
	if (T != NULL)
	{
		LRD_DG_printTree(T->lchild);
		LRD_DG_printTree(T->rchild);
		cout << T->data << " ";
	}
 
}
 
//先序非递归
void DLR_printTree(BiTree T) {
	stack s;
	if (T == NULL)return;
	BiTree p = T;
	while (!s.empty() || p != NULL) {
		if (p) {
			cout << p->data << " ";
			s.push(p);
			p = p->lchild;
		}
		else {
			p = s.top();
			s.pop();	    
			p = p->rchild;
		}
	}
}
//中序非递归
void LDR_printTree(BiTree T) {
	stack s;
	if (T == NULL)return;
	BiTree p = T;
	while (!s.empty() || p != NULL) {
		if (p) {
			s.push(p);
			p = p->lchild;
		}
		else {
			p = s.top();
			s.pop();
			cout << p->data << " ";
			p = p->rchild;
		}
	}
}
//后序非递归方法一
void LRD_printTree(BiTree T) {
	stack s;
	if (T == NULL)return;
	BiTNode* p = T;
 
	while ( !s.empty()||p != NULL )
	{
		if (p)
		{
			s.push(p);
			p = p->lchild;
		}
		else 
		{
			p = s.top();
			if (p->isfirst == false) {
				cout << p->data << " ";
				s.pop();
				p = NULL;
			}
			else {
				p->isfirst = false;
				p = p->rchild;
			}
		}
	}
}
//后序非递归方法二
void LRD_1_printTree(BiTree T) {
	stack s;
	if (T == NULL)return;
	BiTree p = T;
	BiTree pre = T;
	while (!s.empty() || p != NULL)
	{
		if (p)
		{
			s.push(p);
			p = p->lchild;			
		}
		else
		{
			p = s.top();
			if (p->rchild== pre || p->rchild == NULL) {
				cout << p->data << " ";
				s.pop();
				pre = p;
				p = NULL;
			}
			else
			{
				p = p->rchild;
			}
		}
	}
}
//层次
void CC_printTree(BiTree T) {
	queue Q;
	Q.push(T);
	BiTree p;
	while (!Q.empty())
	{
		p = Q.front();
		Q.pop();
		cout << p->data<<" ";
		if (p->lchild) Q.push(p->lchild);
		if (p->rchild) Q.push(p->rchild);
	}
}
 
 
int main() {
	BiTree T;
	cout << "先序遍历创建二叉树" << endl;
	DLR_DG_createTree(T);
 
	cout << "递归先序遍历:";
	DLR_DG_printTree(T);
	cout << endl;
 
	cout << "递归中序遍历:" ;
	LDR_DG_printTree(T);
	cout << endl;
 
	cout << "递归后序遍历:" ;
	LRD_DG_printTree(T);
	cout << endl;
 
	cout << "层次遍历:";
	CC_printTree(T);
	cout << endl;
 
	cout << "中序遍历:";
	LDR_printTree(T);
	cout << endl;
 
	cout << "先序遍历:";
	DLR_printTree(T);
	cout << endl;
 
	cout << "后序遍历:";
	LRD_printTree(T);
	cout << endl;
}
 
前中后递归遍历

递归思想代码都非常类似
前序:

class Solution {
public:
    void traversal(TreeNode* cur, vector& vec) {
        if (cur == NULL) return;
        vec.push_back(cur->val);    // 中
        traversal(cur->left, vec);  // 左
        traversal(cur->right, vec); // 右
    }
    vector preorderTraversal(TreeNode* root) {
        vector result;
        traversal(root, result);
        return result;
    }
};

中序:

  void traversal(TreeNode* cur, vector& vec) {
        if (cur == NULL) return;
        traversal(cur->left, vec);  // 左
        vec.push_back(cur->val);    // 中
        traversal(cur->right, vec); // 右
    }

后序:

void traversal(TreeNode* cur, vector& vec) {
    if (cur == NULL) return;
    traversal(cur->left, vec);  // 左
    traversal(cur->right, vec); // 右
    vec.push_back(cur->val);    // 中
}
前序和中序的迭代写法

由于前序和中序的迭代写法很类似就放在一起了
非递归的三组先中后,有相同的结构

stack s;
BiTree p = T;
while (!s.empty() || p != NULL)
{
    if (p)....
    else....
}

不同的地方在于只需要按照逻辑修改if和else里面的代码就好了。

把握住中序遍历的思想(如下所示),就把握住了先序遍历(只是访问的顺序不一样):
根节点和所有左子入栈
出栈,访问出栈节点
出栈节点的第一个右节点入栈
访问这个右节点的所有左孩子

前序:
class Solution {
public:
    vector preorderTraversal(TreeNode* root) {
    vectorres;
    stack stack;
    while(!stack.empty()||root!=NULL){
       if(root){
           stack.push(root);
           res.push_back(root->val);
           root=root->left;
       }
       else{
           TreeNode* temp=stack.top();
           stack.pop();
           root=temp->right;
       }

    }
    return res;
    }
};
中序
class Solution {
public:
    void inorder(TreeNode *root,vector &res){
        stack stack;
        while(root!=NULL||!stack.empty()){
        if(root!=NULL) {
            stack.push(root);
            root=root->left;
        }
        else {
            TreeNode* temp=stack.top();
            stack.pop();
            res.push_back(temp->val);
            root=temp->right;
        }
        }
 
    }
    vector inorderTraversal(TreeNode* root) {
    vector res;
    inorder(root,res);
    return res;
    }
};
中序题解

https://blog.csdn.net/qq_52934831/article/details/119121225?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163280647116780265457877%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=163280647116780265457877&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v2~rank_v29-1-119121225.pc_v2_rank_blog_default&utm_term=%E4%B8%AD%E5%BA%8F&spm=1018.2226.3001.4450

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/272863.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号