面试常见知识点--树的遍历

发布时间:2024年01月12日

一、前序遍历

算法流程:

1.先申请一个栈,记为stk

2.然后将根节点压入stk中。

3.每次从stk中弹出栈顶节点,记为cur,然后打印cur的值。如果cur的右子树不为空,将cur的右子树压入stk中。如果cur的左子树不为空,将cur的左子树压入stk中。不断重复次步骤直到stk为空循环结束。

void Tree::Preorder(Node* root) {
	stack<Node*>stk;
	stk.push(root);
	cout << "前序遍历" << endl;
	while (!stk.empty()) {
		Node* cur = stk.top();
		cout << cur->val << " ";
		stk.pop();
		if (cur->right) {
			stk.push(cur->right);
		}
		if (cur->left) {
			stk.push(cur->left);
		}
	}
}

二、中序遍历

1.申请一个栈记为stk,申请一个变量curcur被根节点初始化。

2.把cur节点压入栈中,对以cur节点为根节点的整棵子树,依次把整棵树的左边界压入到栈中,即不断的执stk.push(cur)?;?cur?=?cur->left;直到cur为空停止本次循环。

3.上面循环停止后,弹出栈顶节点,记录为node,打印node,并且让cur=node->right;然后继续重复步骤2

4.直到stk为空并且cur也为空时,停止整个循环。

void Tree::Inorder(Node* root) {
	Node* cur = root;
	stack<Node*>stk;
	cout << endl;
	cout << "中序遍历"<<endl;
	while (cur||!stk.empty()) {
		while(cur){
			stk.push(cur);
			cur = cur->left;
		}
		Node* Node = stk.top();
		stk.pop();
		cout << Node->val << " ";
		cur = Node->right;
	}

三、后序遍历

1.申请两个栈,记为S1S2,然后将头结点压入S1中。

2.s1中弹出的节点记为cur;然后先把cur的左子树压入到s1中,然后把cur的右子树压入到s1中。每一个从S1中弹出的节点都放进S2中。

3.不断重复步骤2,直到S1为空,整个过程结束。

void Tree::Postorder(Node* root) {
	stack<Node*>S1;
	stack<Node*>S2;;
	S1.push(root);
	cout << endl;
	cout << "后序遍历" << endl;
	while (!S1.empty()) {
		Node* cur = S1.top();
		S2.push(cur);
		S1.pop();
		if (cur->left) {
			S1.push(cur->left);
		}
		if (cur->right) {
			S1.push(cur->right);
		}		
		}
	    while (!S2.empty()) {
        cout << S2.top()->val << " ";
	S2.pop();	
	}
}

文章来源:https://blog.csdn.net/qq_57106289/article/details/135499009
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。